# LogicTest: local

subtest generate_series

query TTT
EXPLAIN SELECT * FROM generate_series(1, 3)
----
project set    ·  ·
 └── emptyrow  ·  ·

query TTT
EXPLAIN SELECT * FROM generate_series(1, 2), generate_series(1, 2)
----
hash-join           ·     ·
 │                  type  cross
 ├── project set    ·     ·
 │    └── emptyrow  ·     ·
 └── project set    ·     ·
      └── emptyrow  ·     ·

query TTT
EXPLAIN SELECT generate_series(1, 3)
----
project set    ·  ·
 └── emptyrow  ·  ·

subtest multiple_SRFs

query TTTTT
EXPLAIN (VERBOSE) SELECT generate_series(1, 2), generate_series(1, 2)
----
project set    ·         ·                      (generate_series, generate_series)  ·
 │             render 0  generate_series(1, 2)  ·                                   ·
 │             render 1  generate_series(1, 2)  ·                                   ·
 └── emptyrow  ·         ·                      ()                                  ·

statement ok
CREATE TABLE t (a string)

statement ok
CREATE TABLE u (b string)

query TTTTT
EXPLAIN (VERBOSE) SELECT t.*, u.*, generate_series(1,2), generate_series(3, 4) FROM t, u
----
render               ·         ·                                  (a, b, generate_series, generate_series)                                                ·
 │                   render 0  test.public.t.a                    ·                                                                                       ·
 │                   render 1  test.public.u.b                    ·                                                                                       ·
 │                   render 2  generate_series_0.generate_series  ·                                                                                       ·
 │                   render 3  generate_series_1.generate_series  ·                                                                                       ·
 └── project set     ·         ·                                  (a, rowid[hidden,omitted], b, rowid[hidden,omitted], generate_series, generate_series)  ·
      │              render 0  generate_series(1, 2)              ·                                                                                       ·
      │              render 1  generate_series(3, 4)              ·                                                                                       ·
      └── hash-join  ·         ·                                  (a, rowid[hidden,omitted], b, rowid[hidden,omitted])                                    ·
           │         type      cross                              ·                                                                                       ·
           ├── scan  ·         ·                                  (a, rowid[hidden,omitted])                                                              rowid!=NULL; key(rowid)
           │         table     t@primary                          ·                                                                                       ·
           │         spans     ALL                                ·                                                                                       ·
           └── scan  ·         ·                                  (b, rowid[hidden,omitted])                                                              rowid!=NULL; key(rowid)
·                    table     u@primary                          ·                                                                                       ·
·                    spans     ALL                                ·                                                                                       ·

subtest corr_SRFs

# Check that sources get omitted properly.
query TTT
SELECT tree, description, columns FROM [EXPLAIN (VERBOSE) SELECT generate_series(1, 3) FROM t]
----
render            ·                                  (generate_series)
 │                generate_series_0.generate_series  ·
 └── project set  ·                                  (a[omitted], rowid[hidden,omitted], generate_series)
      │           generate_series(1, 3)              ·
      └── scan    ·                                  (a[omitted], rowid[hidden,omitted])
·                 t@primary                          ·
·                 ALL                                ·

# Check that SRFs get omitted properly.
query TTT
SELECT tree, description, columns FROM [EXPLAIN (VERBOSE) SELECT a FROM (SELECT a, generate_series(1, 3) FROM t)]
----
render                 ·                      (a)
 │                     a                      ·
 └── render            ·                      (a, generate_series[omitted])
      │                test.public.t.a        ·
      │                NULL                   ·
      └── project set  ·                      (a, rowid[hidden,omitted], generate_series[omitted])
           │           generate_series(1, 3)  ·
           └── scan    ·                      (a, rowid[hidden,omitted])
·                      t@primary              ·
·                      ALL                    ·

# Check that an omitted column in the render doesn't cause the omitted
# column to disappear from underneath the SRF.
query TTT
SELECT tree, description, columns FROM [EXPLAIN (VERBOSE) SELECT count(*) FROM (SELECT generate_series(1, length(a)) FROM t)]
----
group                       ·                                            (count)
 │                          count_rows()                                 ·
 │                          ·                                            ·
 └── render                 ·                                            ()
      └── render            ·                                            (generate_series[omitted])
           │                NULL                                         ·
           └── project set  ·                                            (a, rowid[hidden,omitted], generate_series[omitted])
                │           generate_series(1, length(test.public.t.a))  ·
                └── scan    ·                                            (a, rowid[hidden,omitted])
·                           t@primary                                    ·
·                           ALL                                          ·

query TTT
SELECT tree, description, columns FROM [EXPLAIN (VERBOSE) SELECT generate_series(1, length(a)) FROM t]
----
render            ·                                            (generate_series)
 │                generate_series_0.generate_series            ·
 └── project set  ·                                            (a, rowid[hidden,omitted], generate_series)
      │           generate_series(1, length(test.public.t.a))  ·
      └── scan    ·                                            (a, rowid[hidden,omitted])
·                 t@primary                                    ·
·                 ALL                                          ·

# Check that the unary source gets processed properly.
query TTT
SELECT tree, description, columns FROM [EXPLAIN (VERBOSE) SELECT generate_series(1, length(a)), crdb_internal.unary_table(), generate_series(1, 3) FROM t]
----
render            ·                                            (generate_series, "crdb_internal.unary_table", generate_series)
 │                generate_series_0.generate_series            ·
 │                ()                                           ·
 │                generate_series_2.generate_series            ·
 └── project set  ·                                            (a, rowid[hidden,omitted], generate_series, generate_series)
      │           generate_series(1, length(test.public.t.a))  ·
      │           crdb_internal.unary_table()                  ·
      │           generate_series(1, 3)                        ·
      └── scan    ·                                            (a, rowid[hidden,omitted])
·                 t@primary                                    ·
·                 ALL                                          ·

subtest srf_source_order

# Check that SRFs do not abuse their source's ordering.

statement ok
CREATE TABLE v(x INT PRIMARY KEY)

query TTTTT
EXPLAIN(VERBOSE) SELECT x, generate_series(3, x, -1) FROM v
ORDER BY 1, 2;
----
sort              ·         ·                                        (x, generate_series)  x!=NULL; +x,+generate_series
 │                order     +x,+generate_series                      ·                     ·
 └── project set  ·         ·                                        (x, generate_series)  x!=NULL; +x
      │           render 0  generate_series(3, test.public.v.x, -1)  ·                     ·
      └── scan    ·         ·                                        (x)                   x!=NULL; key(x); +x
·                 table     v@primary                                ·                     ·
·                 spans     ALL                                      ·                     ·
