NLJ的新代码(3)

下面的函数运行后在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;

猜你喜欢

转载自blog.csdn.net/zhoutianzi12/article/details/91855013