@@ -680,6 +680,7 @@ void Executor::clearMetaInfoCache() {
680680 input_table_info_cache_.clear ();
681681 agg_col_range_cache_.clear ();
682682 string_dictionary_generations_.clear ();
683+ table_generations_.clear ();
683684}
684685
685686std::vector<int8_t > Executor::serializeLiterals (const std::unordered_map<int , Executor::LiteralValues>& literals,
@@ -807,7 +808,7 @@ std::vector<llvm::Value*> Executor::codegen(const Analyzer::Expr* expr,
807808 }
808809 auto col_var = dynamic_cast <const Analyzer::ColumnVar*>(expr);
809810 if (col_var) {
810- return codegen (col_var, fetch_columns, co. hoist_literals_ );
811+ return codegen (col_var, fetch_columns, co);
811812 }
812813 auto constant = dynamic_cast <const Analyzer::Constant*>(expr);
813814 if (constant) {
@@ -1302,8 +1303,8 @@ size_t get_col_bit_width(const Analyzer::ColumnVar* col_var) {
13021303
13031304std::vector<llvm::Value*> Executor::codegen (const Analyzer::ColumnVar* col_var,
13041305 const bool fetch_column,
1305- const bool hoist_literals ) {
1306- const auto col_var_lvs = codegenColVar (col_var, fetch_column, hoist_literals );
1306+ const CompilationOptions& co ) {
1307+ const auto col_var_lvs = codegenColVar (col_var, fetch_column, co );
13071308 if (!cgen_state_->outer_join_cond_lv_ || col_var->get_rte_idx () == 0 ) {
13081309 return col_var_lvs;
13091310 }
@@ -1312,7 +1313,8 @@ std::vector<llvm::Value*> Executor::codegen(const Analyzer::ColumnVar* col_var,
13121313
13131314std::vector<llvm::Value*> Executor::codegenColVar (const Analyzer::ColumnVar* col_var,
13141315 const bool fetch_column,
1315- const bool hoist_literals) {
1316+ const CompilationOptions& co) {
1317+ const bool hoist_literals = co.hoist_literals_ ;
13161318 auto col_id = col_var->get_column_id ();
13171319 const auto rte_idx = col_var->get_rte_idx () == -1 ? int (0 ) : col_var->get_rte_idx ();
13181320#ifdef ENABLE_MULTIFRAG_JOIN
@@ -1331,7 +1333,18 @@ std::vector<llvm::Value*> Executor::codegenColVar(const Analyzer::ColumnVar* col
13311333#endif
13321334 const auto offset = cgen_state_->frag_offsets_ [rte_idx];
13331335 if (offset) {
1334- return {cgen_state_->ir_builder_ .CreateAdd (posArg (col_var), offset)};
1336+ const auto & table_generation = table_generations_.getGeneration (col_var->get_table_id ());
1337+ if (table_generation.start_rowid > 0 ) {
1338+ Datum d;
1339+ d.bigintval = table_generation.start_rowid ;
1340+ const auto start_rowid = makeExpr<Analyzer::Constant>(kBIGINT , false , d);
1341+ const auto start_rowid_lvs = codegen (start_rowid.get (), kENCODING_NONE , -1 , co);
1342+ CHECK_EQ (size_t (1 ), start_rowid_lvs.size ());
1343+ return {cgen_state_->ir_builder_ .CreateAdd (cgen_state_->ir_builder_ .CreateAdd (posArg (col_var), offset),
1344+ start_rowid_lvs.front ())};
1345+ } else {
1346+ return {cgen_state_->ir_builder_ .CreateAdd (posArg (col_var), offset)};
1347+ }
13351348 } else {
13361349 return {posArg (col_var)};
13371350 }
@@ -1353,7 +1366,7 @@ std::vector<llvm::Value*> Executor::codegenColVar(const Analyzer::ColumnVar* col
13531366 if (plan_state_->isLazyFetchColumn (col_var)) {
13541367 plan_state_->columns_to_fetch_ .insert (std::make_pair (col_var->get_table_id (), col_var->get_column_id ()));
13551368 }
1356- return codegen (hash_join_lhs, fetch_column, hoist_literals );
1369+ return codegen (hash_join_lhs, fetch_column, co );
13571370 }
13581371 auto pos_arg = posArg (col_var);
13591372 auto col_byte_stream = colByteStream (col_var, fetch_column, hoist_literals);
@@ -1992,7 +2005,7 @@ std::string get_null_check_suffix(const SQLTypeInfo& lhs_ti, const SQLTypeInfo&
19922005llvm::Value* Executor::codegenCmp (const Analyzer::BinOper* bin_oper, const CompilationOptions& co) {
19932006 for (const auto equi_join_tautology : plan_state_->join_info_ .equi_join_tautologies_ ) {
19942007 if (*equi_join_tautology == *bin_oper) {
1995- return plan_state_->join_info_ .join_hash_table_ ->codegenSlot (co. hoist_literals_ );
2008+ return plan_state_->join_info_ .join_hash_table_ ->codegenSlot (co);
19962009 }
19972010 }
19982011 const auto optype = bin_oper->get_optype ();
@@ -7421,11 +7434,14 @@ std::pair<bool, int64_t> Executor::skipFragment(const InputDescriptor& table_des
74217434 int64_t chunk_min{0 };
74227435 int64_t chunk_max{0 };
74237436 bool is_rowid{false };
7437+ size_t start_rowid{0 };
74247438 if (chunk_meta_it == fragment.getChunkMetadataMap ().end ()) {
74257439 auto cd = get_column_descriptor (col_id, table_id, *catalog_);
74267440 CHECK (cd->isVirtualCol && cd->columnName == " rowid" );
7427- chunk_min = all_frag_row_offsets[frag_idx];
7428- chunk_max = all_frag_row_offsets[frag_idx + 1 ] - 1 ;
7441+ const auto & table_generation = table_generations_.getGeneration (table_id);
7442+ start_rowid = table_generation.start_rowid ;
7443+ chunk_min = all_frag_row_offsets[frag_idx] + start_rowid;
7444+ chunk_max = all_frag_row_offsets[frag_idx + 1 ] - 1 + start_rowid;
74297445 is_rowid = true ;
74307446 } else {
74317447 const auto & chunk_type = lhs->get_type_info ();
@@ -7458,7 +7474,7 @@ std::pair<bool, int64_t> Executor::skipFragment(const InputDescriptor& table_des
74587474 if (chunk_min > rhs_val || chunk_max < rhs_val) {
74597475 return {true , -1 };
74607476 } else if (is_rowid) {
7461- return {false , rhs_val};
7477+ return {false , rhs_val - start_rowid };
74627478 }
74637479 break ;
74647480 default :
0 commit comments