Line data Source code
1 : #include <memory>
2 : #include <utility>
3 : #include <vector>
4 :
5 : #include "backend/engine/semantic/eval_context.h"
6 : #include "backend/engine/semantic/scan_eval.h"
7 : #include "backend/engine/semantic/value.h"
8 : #include "googlesql/public/types/type_factory.h"
9 : #include "googlesql/public/value.h"
10 : #include "googlesql/resolved_ast/resolved_ast.h"
11 : #include "gtest/gtest.h"
12 :
13 : namespace bigquery_emulator {
14 : namespace backend {
15 : namespace engine {
16 : namespace semantic {
17 : namespace {
18 :
19 1 : TEST(ScanEvalAggregateDeferredTest, DeferredComputedColumnEvaluatesValue) {
20 1 : ::googlesql::TypeFactory type_factory;
21 1 : const ::googlesql::Type* int64 = type_factory.get_int64();
22 1 : const ::googlesql::Type* bytes = type_factory.get_bytes();
23 :
24 1 : ::googlesql::ResolvedColumn out_col(
25 1 : /*column_id=*/300,
26 1 : ::googlesql::IdString::MakeGlobal("$query"),
27 1 : ::googlesql::IdString::MakeGlobal("v"),
28 1 : int64);
29 1 : ::googlesql::ResolvedColumn side_col(
30 1 : /*column_id=*/301,
31 1 : ::googlesql::IdString::MakeGlobal("$query"),
32 1 : ::googlesql::IdString::MakeGlobal("_se"),
33 1 : bytes);
34 :
35 1 : std::vector<std::unique_ptr<const ::googlesql::ResolvedComputedColumnBase>>
36 1 : aggregate_list;
37 1 : aggregate_list.push_back(::googlesql::MakeResolvedDeferredComputedColumn(
38 1 : out_col,
39 1 : ::googlesql::MakeResolvedLiteral(::googlesql::Value::Int64(7)),
40 1 : side_col));
41 :
42 1 : auto agg_scan = ::googlesql::MakeResolvedAggregateScan(
43 1 : /*column_list=*/{out_col, side_col},
44 1 : ::googlesql::MakeResolvedSingleRowScan(),
45 1 : /*group_by_list=*/{},
46 1 : std::move(aggregate_list),
47 1 : /*grouping_set_list=*/{},
48 1 : /*rollup_column_list=*/{});
49 :
50 1 : EvalContext ctx{.project_id = "test"};
51 1 : auto rows_or = MaterializeScan(agg_scan.get(), ctx);
52 2 : ASSERT_TRUE(rows_or.ok()) << rows_or.status();
53 1 : ASSERT_EQ(rows_or->size(), 1u);
54 1 : const ColumnBindings& row = rows_or->at(0);
55 1 : auto vit = row.find(out_col.column_id());
56 1 : ASSERT_NE(vit, row.end());
57 1 : EXPECT_EQ(vit->second.int64_value(), 7);
58 1 : auto sit = row.find(side_col.column_id());
59 1 : ASSERT_NE(sit, row.end());
60 1 : EXPECT_TRUE(sit->second.is_null());
61 1 : }
62 :
63 : } // namespace
64 : } // namespace semantic
65 : } // namespace engine
66 : } // namespace backend
67 : } // namespace bigquery_emulator
|