#include "catch.hpp" #include "test_helpers.hpp" #include "duckdb/parser/parser.hpp" #include "duckdb/planner/logical_operator.hpp" #include #include using namespace duckdb; using namespace std; TEST_CASE("Test GetTableNames", "[api]") { DuckDB db(nullptr); Connection con(db); unordered_set table_names; // standard table_names = con.GetTableNames("SELECT * FROM my_table"); REQUIRE(table_names.size() == 1); REQUIRE(table_names.count("my_table")); // fetch a specific column table_names = con.GetTableNames("SELECT col_a FROM my_table"); REQUIRE(table_names.size() == 1); REQUIRE(table_names.count("my_table")); // multiple tables table_names = con.GetTableNames("SELECT * FROM my_table1, my_table2, my_table3"); REQUIRE(table_names.size() == 3); REQUIRE(table_names.count("my_table1")); REQUIRE(table_names.count("my_table2")); REQUIRE(table_names.count("my_table3")); // same table is mentioned multiple times table_names = con.GetTableNames("SELECT col_a FROM my_table, my_table m2, my_table m3"); REQUIRE(table_names.size() == 1); REQUIRE(table_names.count("my_table")); // cte table_names = con.GetTableNames("WITH cte AS (SELECT * FROM my_table) SELECT * FROM cte"); REQUIRE(table_names.size() == 1); REQUIRE(table_names.count("my_table")); // subqueries table_names = con.GetTableNames("SELECT * FROM (SELECT * FROM (SELECT * FROM my_table) bla) bla3"); REQUIRE(table_names.size() == 1); REQUIRE(table_names.count("my_table")); // join table_names = con.GetTableNames("SELECT col_a FROM my_table JOIN my_table2 ON (my_table.col_b=my_table2.col_d)"); REQUIRE(table_names.size() == 2); REQUIRE(table_names.count("my_table")); REQUIRE(table_names.count("my_table2")); // scalar subquery table_names = con.GetTableNames("SELECT (SELECT COUNT(*) FROM my_table)"); REQUIRE(table_names.size() == 1); REQUIRE(table_names.count("my_table")); // set operations table_names = con.GetTableNames("SELECT * FROM my_table UNION ALL SELECT * FROM my_table2 INTERSECT SELECT * FROM my_table3"); REQUIRE(table_names.size() == 3); REQUIRE(table_names.count("my_table")); REQUIRE(table_names.count("my_table2")); REQUIRE(table_names.count("my_table3")); // window functions table_names = con.GetTableNames("SELECT row_number() OVER (ORDER BY (SELECT i+j FROM my_table2)) FROM my_table"); REQUIRE(table_names.size() == 2); REQUIRE(table_names.count("my_table")); REQUIRE(table_names.count("my_table2")); // views are expanded REQUIRE_NO_FAIL(con.Query("CREATE TABLE my_table_for_view(i INT)")); REQUIRE_NO_FAIL(con.Query("CREATE VIEW v1 AS SELECT * FROM my_table_for_view")); table_names = con.GetTableNames("SELECT col_a FROM v1"); REQUIRE(table_names.size() == 1); REQUIRE(table_names.count("my_table_for_view")); // * exclude table_names = con.GetTableNames("select * exclude (x) from df"); REQUIRE(table_names.size() == 1); REQUIRE(table_names.count("df")); // * replace table_names = con.GetTableNames("select * replace (42 as x) from df"); REQUIRE(table_names.size() == 1); REQUIRE(table_names.count("df")); // qualified with schema.table and catalog.schema.table string query = "SELECT * FROM schema1.table1, catalog2.schema2.table2"; table_names = con.GetTableNames(query, true); REQUIRE(table_names.size() == 2); REQUIRE(table_names.count("schema1.table1")); REQUIRE(table_names.count("catalog2.schema2.table2")); // qualified and escaped query = "SELECT * FROM schema1.table1, catalog3.\"schema.2\".\"table.2\""; table_names = con.GetTableNames(query, true); REQUIRE(table_names.size() == 2); REQUIRE(table_names.count("schema1.table1")); REQUIRE(table_names.count("catalog3.\"schema.2\".\"table.2\"")); // With alias query = "SELECT * FROM schema1.table1 alias1, catalog3.\"schema.2\".\"table.2\" alias2"; table_names = con.GetTableNames(query, true); // qualified REQUIRE(table_names.size() == 2); REQUIRE(table_names.count("schema1.table1 AS alias1")); REQUIRE(table_names.count("catalog3.\"schema.2\".\"table.2\" AS alias2")); table_names = con.GetTableNames(query); // default REQUIRE(table_names.size() == 2); REQUIRE(table_names.count("table1")); REQUIRE(table_names.count("table.2")); // generate_series table_names = con.GetTableNames("with series_generator as (select * from generate_series(TIMESTAMP '2001-04-10', " "TIMESTAMP '2001-04-11', INTERVAL 1 HOUR)) select * from series_generator"); REQUIRE(table_names.empty()); if (!db.ExtensionIsLoaded("tpch")) { return; } // TPCH // run all TPC-H queries twice // one WITHOUT the tables in the catalog // once WITH the tables in the catalog for (idx_t i = 0; i < 2; i++) { table_names = con.GetTableNames("PRAGMA tpch(1)"); REQUIRE(table_names.size() == 1); REQUIRE(table_names.count("lineitem")); table_names = con.GetTableNames("PRAGMA tpch(2)"); REQUIRE(table_names.size() == 5); REQUIRE(table_names.count("part")); REQUIRE(table_names.count("supplier")); REQUIRE(table_names.count("partsupp")); REQUIRE(table_names.count("nation")); REQUIRE(table_names.count("region")); table_names = con.GetTableNames("PRAGMA tpch(3)"); REQUIRE(table_names.size() == 3); REQUIRE(table_names.count("customer")); REQUIRE(table_names.count("orders")); REQUIRE(table_names.count("lineitem")); table_names = con.GetTableNames("PRAGMA tpch(4)"); REQUIRE(table_names.size() == 2); REQUIRE(table_names.count("orders")); REQUIRE(table_names.count("lineitem")); table_names = con.GetTableNames("PRAGMA tpch(5)"); REQUIRE(table_names.size() == 6); REQUIRE(table_names.count("customer")); REQUIRE(table_names.count("orders")); REQUIRE(table_names.count("lineitem")); REQUIRE(table_names.count("supplier")); REQUIRE(table_names.count("nation")); REQUIRE(table_names.count("region")); table_names = con.GetTableNames("PRAGMA tpch(6)"); REQUIRE(table_names.size() == 1); REQUIRE(table_names.count("lineitem")); table_names = con.GetTableNames("PRAGMA tpch(7)"); REQUIRE(table_names.size() == 5); REQUIRE(table_names.count("supplier")); REQUIRE(table_names.count("lineitem")); REQUIRE(table_names.count("orders")); REQUIRE(table_names.count("customer")); REQUIRE(table_names.count("nation")); table_names = con.GetTableNames("PRAGMA tpch(8)"); REQUIRE(table_names.size() == 7); REQUIRE(table_names.count("part")); REQUIRE(table_names.count("supplier")); REQUIRE(table_names.count("lineitem")); REQUIRE(table_names.count("orders")); REQUIRE(table_names.count("customer")); REQUIRE(table_names.count("nation")); REQUIRE(table_names.count("region")); table_names = con.GetTableNames("PRAGMA tpch(9)"); REQUIRE(table_names.size() == 6); REQUIRE(table_names.count("part")); REQUIRE(table_names.count("supplier")); REQUIRE(table_names.count("lineitem")); REQUIRE(table_names.count("partsupp")); REQUIRE(table_names.count("orders")); REQUIRE(table_names.count("nation")); table_names = con.GetTableNames("PRAGMA tpch(10)"); REQUIRE(table_names.size() == 4); REQUIRE(table_names.count("customer")); REQUIRE(table_names.count("orders")); REQUIRE(table_names.count("lineitem")); REQUIRE(table_names.count("nation")); table_names = con.GetTableNames("PRAGMA tpch(11)"); REQUIRE(table_names.size() == 3); REQUIRE(table_names.count("partsupp")); REQUIRE(table_names.count("supplier")); REQUIRE(table_names.count("nation")); table_names = con.GetTableNames("PRAGMA tpch(12)"); REQUIRE(table_names.size() == 2); REQUIRE(table_names.count("orders")); REQUIRE(table_names.count("lineitem")); table_names = con.GetTableNames("PRAGMA tpch(13)"); REQUIRE(table_names.size() == 2); REQUIRE(table_names.count("customer")); REQUIRE(table_names.count("orders")); table_names = con.GetTableNames("PRAGMA tpch(14)"); REQUIRE(table_names.size() == 2); REQUIRE(table_names.count("part")); REQUIRE(table_names.count("lineitem")); table_names = con.GetTableNames("PRAGMA tpch(15)"); REQUIRE(table_names.size() == 2); REQUIRE(table_names.count("supplier")); REQUIRE(table_names.count("lineitem")); table_names = con.GetTableNames("PRAGMA tpch(16)"); REQUIRE(table_names.size() == 3); REQUIRE(table_names.count("partsupp")); REQUIRE(table_names.count("part")); REQUIRE(table_names.count("supplier")); table_names = con.GetTableNames("PRAGMA tpch(17)"); REQUIRE(table_names.size() == 2); REQUIRE(table_names.count("lineitem")); REQUIRE(table_names.count("part")); table_names = con.GetTableNames("PRAGMA tpch(18)"); REQUIRE(table_names.size() == 3); REQUIRE(table_names.count("customer")); REQUIRE(table_names.count("orders")); REQUIRE(table_names.count("lineitem")); table_names = con.GetTableNames("PRAGMA tpch(19)"); REQUIRE(table_names.size() == 2); REQUIRE(table_names.count("lineitem")); REQUIRE(table_names.count("part")); table_names = con.GetTableNames("PRAGMA tpch(20)"); REQUIRE(table_names.size() == 5); REQUIRE(table_names.count("supplier")); REQUIRE(table_names.count("nation")); REQUIRE(table_names.count("partsupp")); REQUIRE(table_names.count("part")); REQUIRE(table_names.count("lineitem")); table_names = con.GetTableNames("PRAGMA tpch(21)"); REQUIRE(table_names.size() == 4); REQUIRE(table_names.count("supplier")); REQUIRE(table_names.count("lineitem")); REQUIRE(table_names.count("orders")); REQUIRE(table_names.count("nation")); table_names = con.GetTableNames("PRAGMA tpch(22)"); REQUIRE(table_names.size() == 2); REQUIRE(table_names.count("customer")); REQUIRE(table_names.count("orders")); REQUIRE_NO_FAIL(con.Query("CALL dbgen(sf=0)")); } }