aboutsummaryrefslogtreecommitdiffstats
path: root/yql/essentials/sql/pg/optimizer_impl_ut.cpp
blob: 6a58139de9bec072b14925af4c0bad63d0393c8d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <yql/essentials/parser/pg_wrapper/pg_compat.h>

#include <library/cpp/testing/unittest/registar.h>
#include <library/cpp/testing/hook/hook.h>

#include <yql/essentials/parser/pg_wrapper/arena_ctx.h>

#include "optimizer.h"

extern "C" {
#include <yql/essentials/parser/pg_wrapper/thread_inits.h>
}

#ifdef _WIN32
#define __restrict
#endif

#define TypeName PG_TypeName
#define SortBy PG_SortBy
#undef SIZEOF_SIZE_T

extern "C" {
#include "optimizer/paths.h"
}

#undef TypeName
#undef SortBy

using namespace NYql;

Y_UNIT_TEST_SUITE(PgOptimizerImpl) {

Y_TEST_HOOK_BEFORE_RUN(InitTest) {
    pg_thread_init();
}

Y_UNIT_TEST(MakeVar) {
    TArenaMemoryContext ctx;

    auto* v1 = MakeVar(1, 1);
    UNIT_ASSERT(v1);
    UNIT_ASSERT_EQUAL(v1->varno, 1);
    UNIT_ASSERT_EQUAL(v1->varattno, 1);

    auto* v2 = MakeVar(2, 2);
    UNIT_ASSERT(v2);
    UNIT_ASSERT_EQUAL(v2->varno, 2);
    UNIT_ASSERT_EQUAL(v2->varattno, 2);
}

Y_UNIT_TEST(MakeRelOptInfo) {
    TArenaMemoryContext ctx;
    IOptimizer::TRel rel1 = {10, 100, {{}}};
    auto* r1 = MakeRelOptInfo(rel1, 1);
    UNIT_ASSERT(r1);
    UNIT_ASSERT_EQUAL(r1->reltarget->exprs->length, 1);
    UNIT_ASSERT_EQUAL(
        ((Var*)r1->reltarget->exprs->elements[0].ptr_value)->varattno, 1
    );

    UNIT_ASSERT_EQUAL(r1->pathlist->length, 1);
    UNIT_ASSERT_EQUAL(
        ((Path*)r1->pathlist->elements[0].ptr_value)->rows, 10
    );
    UNIT_ASSERT_EQUAL(
        ((Path*)r1->pathlist->elements[0].ptr_value)->total_cost, 100
    );

    IOptimizer::TRel rel2 = {100, 99, {{}, {}}};
    auto* r2 = MakeRelOptInfo(rel2, 2);
    UNIT_ASSERT(r2);
    UNIT_ASSERT_EQUAL(r2->reltarget->exprs->length, 2);
}

Y_UNIT_TEST(MakeRelOptInfoListNull) {
    TArenaMemoryContext ctx;
    auto* l = MakeRelOptInfoList({});
    UNIT_ASSERT(l == nullptr);
}

Y_UNIT_TEST(MakeRelOptInfoList) {
    TArenaMemoryContext ctx;
    IOptimizer::TRel rel1 = {10, 100, {{}}};
    IOptimizer::TRel rel2 = {100, 99, {{}}};
    IOptimizer::TInput input = {.Rels={rel1, rel2}};
    auto* l = MakeRelOptInfoList(input);
    UNIT_ASSERT(l);
    UNIT_ASSERT_EQUAL(l->length, 2);
}

} // PgOptimizerImpl