Line data Source code
1 : #include <vector>
2 :
3 : #include "absl/types/span.h"
4 : #include "backend/engine/duckdb/duckdb_executor_test_fixture.h"
5 : #include "backend/schema/schema.h"
6 : #include "backend/storage/storage.h"
7 : #include "googlesql/resolved_ast/resolved_ast.h"
8 : #include "gtest/gtest.h"
9 :
10 : namespace bigquery_emulator {
11 : namespace backend {
12 : namespace engine {
13 : namespace duckdb {
14 : namespace {
15 :
16 1 : TEST_F(DuckDbExecutorTest, FloatSumOverParquetAttachedTable) {
17 1 : schema::TableSchema bq_schema;
18 1 : schema::ColumnSchema id;
19 1 : id.name = "id";
20 1 : id.type = schema::ColumnType::kInt64;
21 1 : id.mode = schema::ColumnMode::kRequired;
22 1 : bq_schema.columns.push_back(id);
23 1 : schema::ColumnSchema value;
24 1 : value.name = "v";
25 1 : value.type = schema::ColumnType::kFloat64;
26 1 : value.mode = schema::ColumnMode::kRequired;
27 1 : bq_schema.columns.push_back(value);
28 1 : ASSERT_TRUE(storage_->CreateDataset({"proj-test", "ds"}, "US").ok());
29 1 : ASSERT_TRUE(
30 1 : storage_->CreateTable({"proj-test", "ds", "floats"}, bq_schema).ok());
31 :
32 1 : std::vector<storage::Row> rows = {
33 1 : storage::Row{{storage::Value::Int64(1), storage::Value::Float64(10.5)}},
34 1 : storage::Row{{storage::Value::Int64(2), storage::Value::Float64(2.25)}},
35 1 : };
36 1 : ASSERT_TRUE(
37 1 : storage_
38 1 : ->AppendRows({"proj-test", "ds", "floats"}, absl::MakeConstSpan(rows))
39 1 : .ok());
40 :
41 1 : CatalogBundle bundle = MakeCatalog();
42 1 : const std::string sql = "SELECT SUM(v) AS total FROM ds.floats";
43 1 : auto analyzed = Analyze(sql, bundle.catalog.get(), /*all_statements=*/false);
44 2 : ASSERT_TRUE(analyzed.ok()) << analyzed.status();
45 1 : const ::googlesql::ResolvedStatement* stmt =
46 1 : (*analyzed)->resolved_statement();
47 1 : ASSERT_NE(stmt, nullptr);
48 :
49 1 : absl::StatusOr<std::unique_ptr<RowSource>> source =
50 1 : executor_->ExecuteQuery(MakeRequest(sql), *stmt, bundle.catalog.get());
51 2 : ASSERT_TRUE(source.ok()) << source.status();
52 :
53 1 : storage::Row row;
54 1 : auto has = (*source)->Next(&row);
55 2 : ASSERT_TRUE(has.ok()) << has.status();
56 1 : ASSERT_TRUE(*has);
57 1 : ASSERT_EQ(row.cells.size(), 1u);
58 1 : ASSERT_EQ(row.cells[0].kind(), storage::Value::Kind::kFloat64);
59 1 : EXPECT_DOUBLE_EQ(row.cells[0].float64_value(), 12.75);
60 1 : }
61 :
62 : } // namespace
63 : } // namespace duckdb
64 : } // namespace engine
65 : } // namespace backend
66 : } // namespace bigquery_emulator
|