diff --git a/src/backend/codegen/exec_variable_list_codegen.cc b/src/backend/codegen/exec_variable_list_codegen.cc index fbab72878390f0ab6d6102f8f3be500766bf22f9..e3b24e021610a1cd4d43e912ec1524b5525880ca 100644 --- a/src/backend/codegen/exec_variable_list_codegen.cc +++ b/src/backend/codegen/exec_variable_list_codegen.cc @@ -147,10 +147,17 @@ bool ExecVariableListCodegen::GenerateExecVariableList( // Generate slot_getattr for attributes all the way to max_attr - assert(nullptr != slot_getattr_codegen_); - slot_getattr_codegen_->GenerateCode(codegen_utils); - llvm::Function* slot_getattr_func = - slot_getattr_codegen_->GetGeneratedFunction(); + llvm::Function* slot_getattr_func = nullptr; + // If slot_getattr_codegen_ is not set or generation fails + // we revert to use the external slot_getattr() + if (nullptr == slot_getattr_codegen_ || + false == slot_getattr_codegen_->GenerateCode(codegen_utils)) { + slot_getattr_func = codegen_utils->GetOrRegisterExternalFunction( + slot_getattr_regular, "slot_getattr_regular"); + } else { + slot_getattr_func = slot_getattr_codegen_->GetGeneratedFunction(); + assert(nullptr != slot_getattr_func); + } // In case the above generation failed, no point in continuing since that was // the most crucial part of ExecVariableList code generation.