下面的函数运行后在dblib_output_qual_index里得到了成对成对的搭配好的index!!
/*
* execute join and calculate result slots
*/
dblib_output_index_col = DblibNestLoopJoin(dblib_output_qual_index, dblib_input_outer,
dblib_input_inner, dblib_outer_col, dblib_inner_col, dblib_join_funcid);
下面的代码意思很简单了
/*
* Mark the end position of qual_index
*/
dblib_output_qual_index[dblib_output_index_col * 2] = -1;
dblib_output_qual_index[dblib_output_index_col * 2 + 1] = -1;
下面的东西是需要的
/*
* We need to use ExecProject to initialize some status of node,
* otherwise, it's forbidden to return dblib_result_tupleslot;
*/
outerTupleSlot = ExecProcNode(outerPlan);
innerTupleSlot = ExecProcNode(innerPlan);
while (TupIsNull(innerTupleSlot) || TupIsNull(outerTupleSlot))
{
ENL1_printf("rescanning inner plan");
ExecReScan(outerPlan);
outerTupleSlot = ExecProcNode(outerPlan);
ExecReScan(innerPlan);
innerTupleSlot = ExecProcNode(innerPlan);
}
econtext->ecxt_outertuple = outerTupleSlot;
econtext->ecxt_innertuple = innerTupleSlot;
dblib_result_tupleslot = ExecProject(node->js.ps.ps_ProjInfo);
截至到上面就是第一次循环时候应该调用的代码了。
下面就应该轮到对于第二第三次第四次应该怎么处理呢?
那无非就是根据dblib_output_qual_index数组去构造一个dblib_result_tupleslot指针指向的结果作为返回啊。
for (dblib_i = 0; dblib_i < dblib_output_index_col; dblib_i++)
{
int dblib_temp_i = dblib_i * 2;
int dblib_outer_valid_index = dblib_output_qual_index[dblib_temp_i];
int dblib_inner_valid_index = dblib_output_qual_index[dblib_temp_i + 1];
if (dblib_outer_valid_index > -1 &&
dblib_inner_valid_index > -1)
{
node->nl_MatchedOuter = true;
node->nl_NeedNewOuter = true;
dblib_result_tupleslot = node->js.ps.ps_ProjInfo->pi_state.resultslot;
ExecClearTuple(dblib_result_tupleslot);
dblib_result_tupleslot->tts_isempty = false;
dblib_result_tupleslot->tts_nvalid =
dblib_result_tupleslot->tts_tupleDescriptor->natts;
/*
* Assign outer output datums
*/
for (int dblib_j = 0; dblib_j < dblib_outerattr_valid_num; dblib_j++)
{
int dblib_temp_index1 = dblib_outerresult_attnum[dblib_j];
int dblib_temp_index2 = dblib_outer_valid_index *
dblib_outerattr_valid_num + dblib_j;
dblib_result_tupleslot->tts_values[dblib_temp_index1] =
dblib_outer_output_datums[dblib_temp_index2];
dblib_result_tupleslot->tts_isnull[dblib_temp_index1] =
dblib_outer_output_tts_isnull[dblib_temp_index2];
}
/*
* Assign inner output datums
*/
for (int dblib_j = 0; dblib_j < dblib_innerattr_valid_num; dblib_j++)
{
int dblib_temp_index1 = dblib_innerresult_attnum[dblib_j];
int dblib_temp_index2 = dblib_inner_valid_index *
dblib_innerattr_valid_num + dblib_j;
dblib_result_tupleslot->tts_values[dblib_temp_index1] =
dblib_inner_output_datums[dblib_temp_index2];
dblib_result_tupleslot->tts_isnull[dblib_temp_index1] =
dblib_inner_output_tts_isnull[dblib_temp_index2];
}
dblib_output_qual_index[dblib_temp_i] = -1;
dblib_output_qual_index[dblib_temp_i + 1] = -1;
dblib_nestloop_num++;
return dblib_result_tupleslot;
}
}
最后面就是一点点东西
dblib_nestloop_num = 0;
dblib_resultattr_valid_num = 0;
dblib_innerattr_valid_num = 0;
dblib_outerattr_valid_num = 0;
dblib_output_index_col = 0;
dblib_outer_col = 0;
dblib_inner_col = 0;
free(dblib_input_inner);
free(dblib_input_outer);
free(dblib_innerresult_attnum);
free(dblib_outerresult_attnum);
free(dblib_inner_var_attnum);
free(dblib_outer_var_attnum);
free(dblib_outer_output_datums);
free(dblib_outer_output_tts_isnull);
free(dblib_inner_output_datums);
free(dblib_inner_output_tts_isnull);
free(dblib_output_qual_index);
dblib_innerresult_attnum = NULL;
dblib_outerresult_attnum = NULL;
dblib_inner_var_attnum = NULL;
dblib_outer_var_attnum = NULL;
dblib_outer_output_datums = NULL;
dblib_outer_output_tts_isnull = NULL;
dblib_inner_output_datums = NULL;
dblib_inner_output_tts_isnull = NULL;
dblib_output_qual_index = NULL;
/* If all valid result slots are returned,
* return NULL.
*/
return NULL;