#include "postgres.h"#include <ctype.h>#include "ltree.h"
Go to the source code of this file.
Defines | |
| #define | NEXTVAL(x) ( (ltree*)( (char*)(x) + INTALIGN( VARSIZE(x) ) ) ) |
Typedefs | |
| typedef Datum(* | PGCALL2 )(PG_FUNCTION_ARGS) |
Functions | |
| PG_FUNCTION_INFO_V1 (_ltree_isparent) | |
| PG_FUNCTION_INFO_V1 (_ltree_r_isparent) | |
| PG_FUNCTION_INFO_V1 (_ltree_risparent) | |
| PG_FUNCTION_INFO_V1 (_ltree_r_risparent) | |
| PG_FUNCTION_INFO_V1 (_ltq_regex) | |
| PG_FUNCTION_INFO_V1 (_ltq_rregex) | |
| PG_FUNCTION_INFO_V1 (_lt_q_regex) | |
| PG_FUNCTION_INFO_V1 (_lt_q_rregex) | |
| PG_FUNCTION_INFO_V1 (_ltxtq_exec) | |
| PG_FUNCTION_INFO_V1 (_ltxtq_rexec) | |
| Datum | _ltree_r_isparent (PG_FUNCTION_ARGS) |
| Datum | _ltree_r_risparent (PG_FUNCTION_ARGS) |
| PG_FUNCTION_INFO_V1 (_ltree_extract_isparent) | |
| PG_FUNCTION_INFO_V1 (_ltree_extract_risparent) | |
| PG_FUNCTION_INFO_V1 (_ltq_extract_regex) | |
| PG_FUNCTION_INFO_V1 (_ltxtq_extract_exec) | |
| Datum | _ltree_extract_isparent (PG_FUNCTION_ARGS) |
| Datum | _ltree_extract_risparent (PG_FUNCTION_ARGS) |
| Datum | _ltq_extract_regex (PG_FUNCTION_ARGS) |
| Datum | _ltxtq_extract_exec (PG_FUNCTION_ARGS) |
| PG_FUNCTION_INFO_V1 (_lca) | |
| Datum | _lca (PG_FUNCTION_ARGS) |
| static bool | array_iterator (ArrayType *la, PGCALL2 callback, void *param, ltree **found) |
| Datum | _ltree_isparent (PG_FUNCTION_ARGS) |
| Datum | _ltree_risparent (PG_FUNCTION_ARGS) |
| Datum | _ltq_regex (PG_FUNCTION_ARGS) |
| Datum | _ltq_rregex (PG_FUNCTION_ARGS) |
| Datum | _lt_q_regex (PG_FUNCTION_ARGS) |
| Datum | _lt_q_rregex (PG_FUNCTION_ARGS) |
| Datum | _ltxtq_exec (PG_FUNCTION_ARGS) |
| Datum | _ltxtq_rexec (PG_FUNCTION_ARGS) |
| #define NEXTVAL | ( | x | ) | ( (ltree*)( (char*)(x) + INTALIGN( VARSIZE(x) ) ) ) |
Definition at line 42 of file _ltree_op.c.
Referenced by _lca(), _lt_q_regex(), and array_iterator().
Definition at line 40 of file _ltree_op.c.
| Datum _lca | ( | PG_FUNCTION_ARGS | ) |
Definition at line 300 of file _ltree_op.c.
References ARR_DATA_PTR, ARR_DIMS, ARR_NDIM, array_contains_nulls(), ArrayGetNItems(), ereport, errcode(), errmsg(), ERROR, lca_inner(), NEXTVAL, palloc(), pfree(), PG_FREE_IF_COPY, PG_GETARG_ARRAYTYPE_P, PG_RETURN_NULL, and PG_RETURN_POINTER.
{
ArrayType *la = PG_GETARG_ARRAYTYPE_P(0);
int num = ArrayGetNItems(ARR_NDIM(la), ARR_DIMS(la));
ltree *item = (ltree *) ARR_DATA_PTR(la);
ltree **a,
*res;
if (ARR_NDIM(la) > 1)
ereport(ERROR,
(errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
errmsg("array must be one-dimensional")));
if (array_contains_nulls(la))
ereport(ERROR,
(errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
errmsg("array must not contain nulls")));
a = (ltree **) palloc(sizeof(ltree *) * num);
while (num > 0)
{
num--;
a[num] = item;
item = NEXTVAL(item);
}
res = lca_inner(a, ArrayGetNItems(ARR_NDIM(la), ARR_DIMS(la)));
pfree(a);
PG_FREE_IF_COPY(la, 0);
if (res)
PG_RETURN_POINTER(res);
else
PG_RETURN_NULL();
}
| Datum _lt_q_regex | ( | PG_FUNCTION_ARGS | ) |
Definition at line 142 of file _ltree_op.c.
References ARR_DATA_PTR, ARR_DIMS, ARR_NDIM, array_contains_nulls(), array_iterator(), ArrayGetNItems(), ereport, errcode(), errmsg(), ERROR, ltq_regex(), NEXTVAL, NULL, PG_FREE_IF_COPY, PG_GETARG_ARRAYTYPE_P, and PG_RETURN_BOOL.
Referenced by _lt_q_rregex().
{
ArrayType *_tree = PG_GETARG_ARRAYTYPE_P(0);
ArrayType *_query = PG_GETARG_ARRAYTYPE_P(1);
lquery *query = (lquery *) ARR_DATA_PTR(_query);
bool res = false;
int num = ArrayGetNItems(ARR_NDIM(_query), ARR_DIMS(_query));
if (ARR_NDIM(_query) > 1)
ereport(ERROR,
(errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
errmsg("array must be one-dimensional")));
if (array_contains_nulls(_query))
ereport(ERROR,
(errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
errmsg("array must not contain nulls")));
while (num > 0)
{
if (array_iterator(_tree, ltq_regex, (void *) query, NULL))
{
res = true;
break;
}
num--;
query = (lquery *) NEXTVAL(query);
}
PG_FREE_IF_COPY(_tree, 0);
PG_FREE_IF_COPY(_query, 1);
PG_RETURN_BOOL(res);
}
| Datum _lt_q_rregex | ( | PG_FUNCTION_ARGS | ) |
Definition at line 176 of file _ltree_op.c.
References _lt_q_regex(), DirectFunctionCall2, PG_GETARG_DATUM, and PG_RETURN_DATUM.
{
PG_RETURN_DATUM(DirectFunctionCall2(_lt_q_regex,
PG_GETARG_DATUM(1),
PG_GETARG_DATUM(0)
));
}
| Datum _ltq_extract_regex | ( | PG_FUNCTION_ARGS | ) |
Definition at line 254 of file _ltree_op.c.
References array_iterator(), ltq_regex(), palloc(), PG_FREE_IF_COPY, PG_GETARG_ARRAYTYPE_P, PG_GETARG_LQUERY, PG_RETURN_NULL, PG_RETURN_POINTER, and VARSIZE.
{
ArrayType *la = PG_GETARG_ARRAYTYPE_P(0);
lquery *query = PG_GETARG_LQUERY(1);
ltree *found,
*item;
if (!array_iterator(la, ltq_regex, (void *) query, &found))
{
PG_FREE_IF_COPY(la, 0);
PG_FREE_IF_COPY(query, 1);
PG_RETURN_NULL();
}
item = (ltree *) palloc(VARSIZE(found));
memcpy(item, found, VARSIZE(found));
PG_FREE_IF_COPY(la, 0);
PG_FREE_IF_COPY(query, 1);
PG_RETURN_POINTER(item);
}
| Datum _ltq_regex | ( | PG_FUNCTION_ARGS | ) |
Definition at line 121 of file _ltree_op.c.
References array_iterator(), ltq_regex(), NULL, PG_FREE_IF_COPY, PG_GETARG_ARRAYTYPE_P, PG_GETARG_LQUERY, and PG_RETURN_BOOL.
Referenced by _ltq_rregex().
{
ArrayType *la = PG_GETARG_ARRAYTYPE_P(0);
lquery *query = PG_GETARG_LQUERY(1);
bool res = array_iterator(la, ltq_regex, (void *) query, NULL);
PG_FREE_IF_COPY(la, 0);
PG_FREE_IF_COPY(query, 1);
PG_RETURN_BOOL(res);
}
| Datum _ltq_rregex | ( | PG_FUNCTION_ARGS | ) |
Definition at line 133 of file _ltree_op.c.
References _ltq_regex(), DirectFunctionCall2, PG_GETARG_DATUM, and PG_RETURN_DATUM.
{
PG_RETURN_DATUM(DirectFunctionCall2(_ltq_regex,
PG_GETARG_DATUM(1),
PG_GETARG_DATUM(0)
));
}
| Datum _ltree_extract_isparent | ( | PG_FUNCTION_ARGS | ) |
Definition at line 208 of file _ltree_op.c.
References array_iterator(), ltree_isparent(), palloc(), PG_FREE_IF_COPY, PG_GETARG_ARRAYTYPE_P, PG_GETARG_LTREE, PG_RETURN_NULL, PG_RETURN_POINTER, and VARSIZE.
{
ArrayType *la = PG_GETARG_ARRAYTYPE_P(0);
ltree *query = PG_GETARG_LTREE(1);
ltree *found,
*item;
if (!array_iterator(la, ltree_isparent, (void *) query, &found))
{
PG_FREE_IF_COPY(la, 0);
PG_FREE_IF_COPY(query, 1);
PG_RETURN_NULL();
}
item = (ltree *) palloc(VARSIZE(found));
memcpy(item, found, VARSIZE(found));
PG_FREE_IF_COPY(la, 0);
PG_FREE_IF_COPY(query, 1);
PG_RETURN_POINTER(item);
}
| Datum _ltree_extract_risparent | ( | PG_FUNCTION_ARGS | ) |
Definition at line 231 of file _ltree_op.c.
References array_iterator(), ltree_risparent(), palloc(), PG_FREE_IF_COPY, PG_GETARG_ARRAYTYPE_P, PG_GETARG_LTREE, PG_RETURN_NULL, PG_RETURN_POINTER, and VARSIZE.
{
ArrayType *la = PG_GETARG_ARRAYTYPE_P(0);
ltree *query = PG_GETARG_LTREE(1);
ltree *found,
*item;
if (!array_iterator(la, ltree_risparent, (void *) query, &found))
{
PG_FREE_IF_COPY(la, 0);
PG_FREE_IF_COPY(query, 1);
PG_RETURN_NULL();
}
item = (ltree *) palloc(VARSIZE(found));
memcpy(item, found, VARSIZE(found));
PG_FREE_IF_COPY(la, 0);
PG_FREE_IF_COPY(query, 1);
PG_RETURN_POINTER(item);
}
| Datum _ltree_isparent | ( | PG_FUNCTION_ARGS | ) |
Definition at line 79 of file _ltree_op.c.
References array_iterator(), ltree_isparent(), NULL, PG_FREE_IF_COPY, PG_GETARG_ARRAYTYPE_P, PG_GETARG_LTREE, and PG_RETURN_BOOL.
Referenced by _ltree_r_isparent().
{
ArrayType *la = PG_GETARG_ARRAYTYPE_P(0);
ltree *query = PG_GETARG_LTREE(1);
bool res = array_iterator(la, ltree_isparent, (void *) query, NULL);
PG_FREE_IF_COPY(la, 0);
PG_FREE_IF_COPY(query, 1);
PG_RETURN_BOOL(res);
}
| Datum _ltree_r_isparent | ( | PG_FUNCTION_ARGS | ) |
Definition at line 91 of file _ltree_op.c.
References _ltree_isparent(), DirectFunctionCall2, PG_GETARG_DATUM, and PG_RETURN_DATUM.
{
PG_RETURN_DATUM(DirectFunctionCall2(_ltree_isparent,
PG_GETARG_DATUM(1),
PG_GETARG_DATUM(0)
));
}
| Datum _ltree_r_risparent | ( | PG_FUNCTION_ARGS | ) |
Definition at line 112 of file _ltree_op.c.
References _ltree_risparent(), DirectFunctionCall2, PG_GETARG_DATUM, and PG_RETURN_DATUM.
{
PG_RETURN_DATUM(DirectFunctionCall2(_ltree_risparent,
PG_GETARG_DATUM(1),
PG_GETARG_DATUM(0)
));
}
| Datum _ltree_risparent | ( | PG_FUNCTION_ARGS | ) |
Definition at line 100 of file _ltree_op.c.
References array_iterator(), ltree_risparent(), NULL, PG_FREE_IF_COPY, PG_GETARG_ARRAYTYPE_P, PG_GETARG_LTREE, and PG_RETURN_BOOL.
Referenced by _ltree_r_risparent().
{
ArrayType *la = PG_GETARG_ARRAYTYPE_P(0);
ltree *query = PG_GETARG_LTREE(1);
bool res = array_iterator(la, ltree_risparent, (void *) query, NULL);
PG_FREE_IF_COPY(la, 0);
PG_FREE_IF_COPY(query, 1);
PG_RETURN_BOOL(res);
}
| Datum _ltxtq_exec | ( | PG_FUNCTION_ARGS | ) |
Definition at line 186 of file _ltree_op.c.
References array_iterator(), ltxtq_exec(), NULL, PG_FREE_IF_COPY, PG_GETARG_ARRAYTYPE_P, PG_GETARG_LTXTQUERY, and PG_RETURN_BOOL.
Referenced by _ltxtq_rexec().
{
ArrayType *la = PG_GETARG_ARRAYTYPE_P(0);
ltxtquery *query = PG_GETARG_LTXTQUERY(1);
bool res = array_iterator(la, ltxtq_exec, (void *) query, NULL);
PG_FREE_IF_COPY(la, 0);
PG_FREE_IF_COPY(query, 1);
PG_RETURN_BOOL(res);
}
| Datum _ltxtq_extract_exec | ( | PG_FUNCTION_ARGS | ) |
Definition at line 277 of file _ltree_op.c.
References array_iterator(), ltxtq_exec(), palloc(), PG_FREE_IF_COPY, PG_GETARG_ARRAYTYPE_P, PG_GETARG_LTXTQUERY, PG_RETURN_NULL, PG_RETURN_POINTER, and VARSIZE.
{
ArrayType *la = PG_GETARG_ARRAYTYPE_P(0);
ltxtquery *query = PG_GETARG_LTXTQUERY(1);
ltree *found,
*item;
if (!array_iterator(la, ltxtq_exec, (void *) query, &found))
{
PG_FREE_IF_COPY(la, 0);
PG_FREE_IF_COPY(query, 1);
PG_RETURN_NULL();
}
item = (ltree *) palloc(VARSIZE(found));
memcpy(item, found, VARSIZE(found));
PG_FREE_IF_COPY(la, 0);
PG_FREE_IF_COPY(query, 1);
PG_RETURN_POINTER(item);
}
| Datum _ltxtq_rexec | ( | PG_FUNCTION_ARGS | ) |
Definition at line 198 of file _ltree_op.c.
References _ltxtq_exec(), DirectFunctionCall2, PG_GETARG_DATUM, and PG_RETURN_DATUM.
{
PG_RETURN_DATUM(DirectFunctionCall2(_ltxtq_exec,
PG_GETARG_DATUM(1),
PG_GETARG_DATUM(0)
));
}
| static bool array_iterator | ( | ArrayType * | la, | |
| PGCALL2 | callback, | |||
| void * | param, | |||
| ltree ** | found | |||
| ) | [static] |
Definition at line 45 of file _ltree_op.c.
References ARR_DATA_PTR, ARR_DIMS, ARR_NDIM, array_contains_nulls(), ArrayGetNItems(), DatumGetBool, DirectFunctionCall2, ereport, errcode(), errmsg(), ERROR, NEXTVAL, and PointerGetDatum.
Referenced by _lt_q_regex(), _ltq_extract_regex(), _ltq_regex(), _ltree_extract_isparent(), _ltree_extract_risparent(), _ltree_isparent(), _ltree_risparent(), _ltxtq_exec(), and _ltxtq_extract_exec().
{
int num = ArrayGetNItems(ARR_NDIM(la), ARR_DIMS(la));
ltree *item = (ltree *) ARR_DATA_PTR(la);
if (ARR_NDIM(la) > 1)
ereport(ERROR,
(errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
errmsg("array must be one-dimensional")));
if (array_contains_nulls(la))
ereport(ERROR,
(errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
errmsg("array must not contain nulls")));
if (found)
*found = NULL;
while (num > 0)
{
if (DatumGetBool(DirectFunctionCall2(callback,
PointerGetDatum(item), PointerGetDatum(param))))
{
if (found)
*found = item;
return true;
}
num--;
item = NEXTVAL(item);
}
return false;
}
| PG_FUNCTION_INFO_V1 | ( | _ltxtq_extract_exec | ) |
| PG_FUNCTION_INFO_V1 | ( | _ltq_extract_regex | ) |
| PG_FUNCTION_INFO_V1 | ( | _lca | ) |
| PG_FUNCTION_INFO_V1 | ( | _ltree_extract_risparent | ) |
| PG_FUNCTION_INFO_V1 | ( | _ltq_rregex | ) |
| PG_FUNCTION_INFO_V1 | ( | _lt_q_regex | ) |
| PG_FUNCTION_INFO_V1 | ( | _ltree_r_isparent | ) |
| PG_FUNCTION_INFO_V1 | ( | _ltree_extract_isparent | ) |
| PG_FUNCTION_INFO_V1 | ( | _ltree_r_risparent | ) |
| PG_FUNCTION_INFO_V1 | ( | _ltxtq_rexec | ) |
| PG_FUNCTION_INFO_V1 | ( | _ltq_regex | ) |
| PG_FUNCTION_INFO_V1 | ( | _ltree_isparent | ) |
| PG_FUNCTION_INFO_V1 | ( | _ltree_risparent | ) |
| PG_FUNCTION_INFO_V1 | ( | _ltxtq_exec | ) |
| PG_FUNCTION_INFO_V1 | ( | _lt_q_rregex | ) |
1.7.1