Skip to content
This repository was archived by the owner on May 9, 2024. It is now read-only.

Commit 599eea8

Browse files
committed
Add database id to TableGenerations.
Signed-off-by: ienkovich <[email protected]>
1 parent 02cd849 commit 599eea8

File tree

6 files changed

+60
-14
lines changed

6 files changed

+60
-14
lines changed

omniscidb/QueryEngine/ColumnIR.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,8 @@ llvm::Value* CodeGenerator::codegenRowId(const hdk::ir::ColumnVar* col_var,
254254
AUTOMATIC_IR_METADATA(cgen_state_);
255255
const auto offset_lv = cgen_state_->frag_offsets_[adjusted_range_table_index(col_var)];
256256
llvm::Value* start_rowid_lv{nullptr};
257-
const auto& table_generation = executor()->getTableGeneration(col_var->tableId());
257+
const auto& table_generation =
258+
executor()->getTableGeneration(col_var->dbId(), col_var->tableId());
258259
if (table_generation.start_rowid > 0) {
259260
// Handle the multi-node case: each leaf receives a start rowid used
260261
// to offset the local rowid and generate a cluster-wide unique rowid.

omniscidb/QueryEngine/Execute.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -530,8 +530,8 @@ TableFragmentsInfo Executor::getTableInfo(const int db_id, const int table_id) c
530530
return input_table_info_cache_.getTableInfo(db_id, table_id);
531531
}
532532

533-
const TableGeneration& Executor::getTableGeneration(const int table_id) const {
534-
return table_generations_.getGeneration(table_id);
533+
const TableGeneration& Executor::getTableGeneration(int db_id, int table_id) const {
534+
return table_generations_.getGeneration(db_id, table_id);
535535
}
536536

537537
ExpressionRange Executor::getColRange(const PhysicalInput& phys_input) const {
@@ -4056,6 +4056,7 @@ std::pair<bool, int64_t> Executor::skipFragment(
40564056
const std::vector<uint64_t>& frag_offsets,
40574057
const size_t frag_idx,
40584058
compiler::CodegenTraitsDescriptor cgen_traits_desc) {
4059+
const int db_id = table_desc.getDatabaseId();
40594060
const int table_id = table_desc.getTableId();
40604061

40614062
for (const auto& simple_qual : simple_quals) {
@@ -4116,7 +4117,7 @@ std::pair<bool, int64_t> Executor::skipFragment(
41164117
size_t start_rowid{0};
41174118
if (chunk_meta_it == fragment.getChunkMetadataMap().end()) {
41184119
if (lhs_col->isVirtual()) {
4119-
const auto& table_generation = getTableGeneration(table_id);
4120+
const auto& table_generation = getTableGeneration(db_id, table_id);
41204121
start_rowid = table_generation.start_rowid;
41214122
chunk_min = frag_offsets[frag_idx] + start_rowid;
41224123
chunk_max = frag_offsets[frag_idx + 1] - 1 + start_rowid;
@@ -4325,6 +4326,7 @@ TableGenerations Executor::computeTableGenerations(
43254326
for (auto [db_id, table_id] : phys_table_ids) {
43264327
const auto table_info = getTableInfo(db_id, table_id);
43274328
table_generations.setGeneration(
4329+
db_id,
43284330
table_id,
43294331
TableGeneration{static_cast<int64_t>(table_info.getPhysicalNumTuples()), 0});
43304332
}

omniscidb/QueryEngine/Execute.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ class Executor : public StringDictionaryProxyProvider {
352352

353353
TableFragmentsInfo getTableInfo(const int db_id, const int table_id) const;
354354

355-
const TableGeneration& getTableGeneration(const int table_id) const;
355+
const TableGeneration& getTableGeneration(int db_id, int table_id) const;
356356

357357
ExpressionRange getColRange(const PhysicalInput&) const;
358358

omniscidb/QueryEngine/TableGenerations.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,22 @@
1717
#include "TableGenerations.h"
1818
#include "Logger/Logger.h"
1919

20-
void TableGenerations::setGeneration(const uint32_t id,
20+
void TableGenerations::setGeneration(int db_id,
21+
int table_id,
2122
const TableGeneration& generation) {
22-
const auto it_ok = id_to_generation_.emplace(id, generation);
23+
const auto it_ok =
24+
id_to_generation_.emplace(std::make_pair(db_id, table_id), generation);
2325
CHECK(it_ok.second);
2426
}
2527

26-
const TableGeneration& TableGenerations::getGeneration(const uint32_t id) const {
27-
const auto it = id_to_generation_.find(id);
28+
const TableGeneration& TableGenerations::getGeneration(int db_id, int table_id) const {
29+
const auto it = id_to_generation_.find(std::make_pair(db_id, table_id));
2830
CHECK(it != id_to_generation_.end());
2931
return it->second;
3032
}
3133

32-
const std::unordered_map<uint32_t, TableGeneration>& TableGenerations::asMap() const {
34+
const std::unordered_map<std::pair<int, int>, TableGeneration>& TableGenerations::asMap()
35+
const {
3336
return id_to_generation_;
3437
}
3538

omniscidb/QueryEngine/TableGenerations.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,16 @@ struct TableGeneration {
2727

2828
class TableGenerations {
2929
public:
30-
void setGeneration(const uint32_t id, const TableGeneration& generation);
30+
void setGeneration(int db_id, int table_id, const TableGeneration& generation);
3131

32-
const TableGeneration& getGeneration(const uint32_t id) const;
32+
const TableGeneration& getGeneration(int db_id, int table_id) const;
3333

34-
const std::unordered_map<uint32_t, TableGeneration>& asMap() const;
34+
const std::unordered_map<std::pair<int, int>, TableGeneration>& asMap() const;
3535

3636
void clear();
3737

3838
private:
39-
std::unordered_map<uint32_t, TableGeneration> id_to_generation_;
39+
std::unordered_map<std::pair<int, int>, TableGeneration> id_to_generation_;
4040
};
4141

4242
#endif // QUERYENGINE_TABLEGENERATIONS_H

omniscidb/Tests/QueryBuilderTest.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6020,6 +6020,46 @@ TEST_F(Issue513, Reproducer) {
60206020
compare_res_data(res, std::vector<int32_t>({3}));
60216021
}
60226022

6023+
class Issue588 : public TestSuite {
6024+
protected:
6025+
static void SetUpTestSuite() {
6026+
createTable("test_588_1", {{"id", ctx().int64()}, {"A", ctx().int64()}});
6027+
insertCsvValues("test_588_1", "1,1\n2,2\n3,3");
6028+
createTable("test_588_2", {{"id", ctx().int64()}, {"B", ctx().int64()}});
6029+
insertCsvValues("test_588_2", "1,2\n2,3\n3,3");
6030+
createTable("test_588_3", {{"id", ctx().int64()}, {"C", ctx().int64()}});
6031+
insertCsvValues("test_588_3", "1,1\n2,2\n3,3");
6032+
createTable("test_588_4", {{"id", ctx().int64()}, {"D", ctx().int64()}});
6033+
insertCsvValues("test_588_4", "1,2\n2,3\n3,3");
6034+
}
6035+
6036+
static void TearDownTestSuite() {
6037+
dropTable("test_588_1");
6038+
dropTable("test_588_2");
6039+
dropTable("test_588_3");
6040+
dropTable("test_588_4");
6041+
}
6042+
};
6043+
6044+
TEST_F(Issue588, Reproducer1) {
6045+
QueryBuilder builder(ctx(), getSchemaProvider(), configPtr());
6046+
auto scan1 = builder.scan("test_588_1");
6047+
auto scan2 = builder.scan("test_588_2");
6048+
auto scan3 = builder.scan("test_588_3");
6049+
auto scan4 = builder.scan("test_588_4");
6050+
6051+
auto dag1 = scan1.proj({0, 1}).join(scan2.proj({0, 1})).finalize();
6052+
auto res1 = runQuery(std::move(dag1));
6053+
6054+
auto dag2 =
6055+
builder.scan(res1.tableName()).proj({0, 1}).join(scan3.proj({0, 1})).finalize();
6056+
auto res2 = runQuery(std::move(dag2));
6057+
6058+
auto dag3 =
6059+
builder.scan(res2.tableName()).proj({0, 1}).join(scan4.proj({0, 1})).finalize();
6060+
auto res3 = runQuery(std::move(dag3));
6061+
}
6062+
60236063
TEST_F(QueryBuilderTest, RunOnResult) {
60246064
QueryBuilder builder(ctx(), schema_mgr_, configPtr());
60256065

0 commit comments

Comments
 (0)