示例#1
0
Datum
tsquery_phrase_distance(PG_FUNCTION_ARGS)
{
	TSQuery		a = PG_GETARG_TSQUERY_COPY(0);
	TSQuery		b = PG_GETARG_TSQUERY_COPY(1);
	QTNode	   *res;
	TSQuery		query;
	int32		distance = PG_GETARG_INT32(2);

	if (distance < 0 || distance > MAXENTRYPOS)
		ereport(ERROR,
				(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
				 errmsg("distance in phrase operator should be non-negative and less than %d",
						MAXENTRYPOS)));
	if (a->size == 0)
	{
		PG_FREE_IF_COPY(a, 1);
		PG_RETURN_POINTER(b);
	}
	else if (b->size == 0)
	{
		PG_FREE_IF_COPY(b, 1);
		PG_RETURN_POINTER(a);
	}

	res = join_tsqueries(a, b, OP_PHRASE, (uint16) distance);

	query = QTN2QT(res);

	QTNFree(res);
	PG_FREE_IF_COPY(a, 0);
	PG_FREE_IF_COPY(b, 1);

	PG_RETURN_TSQUERY(query);
}
示例#2
0
Datum
tsquery_or(PG_FUNCTION_ARGS)
{
	TSQuery		a = PG_GETARG_TSQUERY_COPY(0);
	TSQuery		b = PG_GETARG_TSQUERY_COPY(1);
	QTNode	   *res;
	TSQuery		query;

	if (a->size == 0)
	{
		PG_FREE_IF_COPY(a, 1);
		PG_RETURN_POINTER(b);
	}
	else if (b->size == 0)
	{
		PG_FREE_IF_COPY(b, 1);
		PG_RETURN_POINTER(a);
	}

	res = join_tsqueries(a, b, OP_OR, 0);

	query = QTN2QT(res);

	QTNFree(res);
	PG_FREE_IF_COPY(a, 0);
	PG_FREE_IF_COPY(b, 1);

	PG_RETURN_TSQUERY(query);
}
示例#3
0
datum_t tsquery_or(PG_FUNC_ARGS)
{
	TSQuery a = ARG_TSQUERY_COPY(0);
	TSQuery b = ARG_TSQUERY_COPY(1);
	QTNode *res;
	TSQuery query;

	if (a->size == 0) {
		PG_FREE_IF_COPY(a, 1);
		RET_POINTER(b);
	} else if (b->size == 0) {
		PG_FREE_IF_COPY(b, 1);
		RET_POINTER(a);
	}

	res = join_tsqueries(a, b, OP_OR);
	query = QTN2QT(res);

	QTNFree(res);
	PG_FREE_IF_COPY(a, 0);
	PG_FREE_IF_COPY(b, 1);

	RET_POINTER(query);
}