Files
email-tracker/external/duckdb/test/api/test_get_table_names.cpp
2025-10-24 19:21:19 -05:00

272 lines
9.5 KiB
C++

#include "catch.hpp"
#include "test_helpers.hpp"
#include "duckdb/parser/parser.hpp"
#include "duckdb/planner/logical_operator.hpp"
#include <chrono>
#include <thread>
using namespace duckdb;
using namespace std;
TEST_CASE("Test GetTableNames", "[api]") {
DuckDB db(nullptr);
Connection con(db);
unordered_set<string> 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)"));
}
}