コード例 #1
0
ファイル: _int_gin.c プロジェクト: colinet/sqlix
datum_t
ginint4_consistent(PG_FUNC_ARGS)
{
	bool	   *check = (bool *) ARG_POINTER(0);
	strat_nr_t strategy = ARG_UINT16(1);
	int32		nkeys = ARG_INT32(3);

	/* pointer_p	   *extra_data = (pointer_p *) ARG_POINTER(4); */
	bool	   *recheck = (bool *) ARG_POINTER(5);
	bool		res = FALSE;
	int32		i;

	switch (strategy)
	{
		case RTOverlapStrategyNumber:
			/* result is not lossy */
			*recheck = false;
			/* at least one element in check[] is true, so result = true */
			res = TRUE;
			break;
		case RTContainedByStrategyNumber:
		case RTOldContainedByStrategyNumber:
			/* we will need recheck */
			*recheck = true;
			/* at least one element in check[] is true, so result = true */
			res = TRUE;
			break;
		case RTSameStrategyNumber:
			/* we will need recheck */
			*recheck = true;
			/* Must have all elements in check[] true */
			res = TRUE;
			for (i = 0; i < nkeys; i++)
			{
				if (!check[i])
				{
					res = FALSE;
					break;
				}
			}
			break;
		case RTContainsStrategyNumber:
		case RTOldContainsStrategyNumber:
			/* result is not lossy */
			*recheck = false;
			/* Must have all elements in check[] true */
			res = TRUE;
			for (i = 0; i < nkeys; i++)
			{
				if (!check[i])
				{
					res = FALSE;
					break;
				}
			}
			break;
		case BooleanSearchStrategy:
			{
				QUERYTYPE  *query = ARG_QUERYTYPE_P(2);

				/* result is not lossy */
				*recheck = false;
				res = gin_bool_consistent(query, check);
			}
			break;
		default:
			elog(ERROR, "ginint4_consistent: unknown strategy number: %d",
				 strategy);
	}

	RET_BOOL(res);
}
コード例 #2
0
ファイル: _int_gin.c プロジェクト: 50wu/gpdb
Datum
ginint4_consistent(PG_FUNCTION_ARGS)
{
	bool	   *check = (bool *) PG_GETARG_POINTER(0);
	StrategyNumber strategy = PG_GETARG_UINT16(1);

	/* int32	nkeys = PG_GETARG_INT32(3); */
	/* Pointer	   *extra_data = (Pointer *) PG_GETARG_POINTER(4); */
	bool	   *recheck = (bool *) PG_GETARG_POINTER(5);
	bool		res = FALSE;

	/*
	 * we need not check array carefully, it's done by previous
	 * ginarrayextract call
	 */

	switch (strategy)
	{
		case RTOverlapStrategyNumber:
			/* result is not lossy */
			*recheck = false;
			/* at least one element in check[] is true, so result = true */
			res = TRUE;
			break;
		case RTContainedByStrategyNumber:
		case RTOldContainedByStrategyNumber:
			/* we will need recheck */
			*recheck = true;
			/* at least one element in check[] is true, so result = true */
			res = TRUE;
			break;
		case RTSameStrategyNumber:
			{
				ArrayType  *query = PG_GETARG_ARRAYTYPE_P(2);
				int			i,
							nentries = ARRNELEMS(query);

				/* we will need recheck */
				*recheck = true;
				res = TRUE;
				for (i = 0; i < nentries; i++)
					if (!check[i])
					{
						res = FALSE;
						break;
					}
			}
			break;
		case RTContainsStrategyNumber:
		case RTOldContainsStrategyNumber:
			{
				ArrayType  *query = PG_GETARG_ARRAYTYPE_P(2);
				int			i,
							nentries = ARRNELEMS(query);

				/* result is not lossy */
				*recheck = false;
				res = TRUE;
				for (i = 0; i < nentries; i++)
					if (!check[i])
					{
						res = FALSE;
						break;
					}
			}
			break;
		case BooleanSearchStrategy:
			{
				QUERYTYPE  *query = (QUERYTYPE *) PG_DETOAST_DATUM(PG_GETARG_POINTER(2));

				/* result is not lossy */
				*recheck = false;
				res = gin_bool_consistent(query, check);
			}
			break;
		default:
			elog(ERROR, "ginint4_consistent: unknown strategy number: %d",
				 strategy);
	}

	PG_RETURN_BOOL(res);
}