summaryrefslogtreecommitdiff
path: root/contrib/ltree/_ltree_op.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/ltree/_ltree_op.c')
-rw-r--r--contrib/ltree/_ltree_op.c310
1 files changed, 170 insertions, 140 deletions
diff --git a/contrib/ltree/_ltree_op.c b/contrib/ltree/_ltree_op.c
index 336b83820c..59de0a51e4 100644
--- a/contrib/ltree/_ltree_op.c
+++ b/contrib/ltree/_ltree_op.c
@@ -1,5 +1,5 @@
/*
- * op function for ltree[]
+ * op function for ltree[]
* Teodor Sigaev <teodor@stack.net>
*/
@@ -16,223 +16,253 @@ PG_FUNCTION_INFO_V1(_ltq_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);
+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);
+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);
+Datum _lca(PG_FUNCTION_ARGS);
+
+typedef Datum (*PGCALL2) (PG_FUNCTION_ARGS);
-typedef Datum (*PGCALL2)(PG_FUNCTION_ARGS);
#define NEXTVAL(x) ( (ltree*)( (char*)(x) + INTALIGN( VARSIZE(x) ) ) )
static bool
-array_iterator( ArrayType *la, PGCALL2 callback, void* param, ltree ** found) {
- int num=ArrayGetNItems( ARR_NDIM(la), ARR_DIMS(la));
- ltree *item = (ltree*)ARR_DATA_PTR(la);
-
- if ( ARR_NDIM(la) !=1 )
- elog(ERROR,"Dimension of array != 1");
-
- if ( found )
- *found=NULL;
- while( num>0 ) {
- if ( DatumGetBool( DirectFunctionCall2( callback,
- PointerGetDatum(item), PointerGetDatum(param) ) ) ) {
-
- if ( found )
+array_iterator(ArrayType *la, PGCALL2 callback, void *param, ltree ** found)
+{
+ int num = ArrayGetNItems(ARR_NDIM(la), ARR_DIMS(la));
+ ltree *item = (ltree *) ARR_DATA_PTR(la);
+
+ if (ARR_NDIM(la) != 1)
+ elog(ERROR, "Dimension of array != 1");
+
+ 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);
+ item = NEXTVAL(item);
}
return false;
}
Datum
-_ltree_isparent(PG_FUNCTION_ARGS) {
- 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);
+_ltree_isparent(PG_FUNCTION_ARGS)
+{
+ 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) {
- PG_RETURN_DATUM( DirectFunctionCall2( _ltree_isparent,
- PG_GETARG_DATUM(1),
- PG_GETARG_DATUM(0)
- ) );
+_ltree_r_isparent(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_DATUM(DirectFunctionCall2(_ltree_isparent,
+ PG_GETARG_DATUM(1),
+ PG_GETARG_DATUM(0)
+ ));
}
Datum
-_ltree_risparent(PG_FUNCTION_ARGS) {
- 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);
+_ltree_risparent(PG_FUNCTION_ARGS)
+{
+ 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
-_ltree_r_risparent(PG_FUNCTION_ARGS) {
- PG_RETURN_DATUM( DirectFunctionCall2( _ltree_risparent,
- PG_GETARG_DATUM(1),
- PG_GETARG_DATUM(0)
- ) );
+_ltree_r_risparent(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_DATUM(DirectFunctionCall2(_ltree_risparent,
+ PG_GETARG_DATUM(1),
+ PG_GETARG_DATUM(0)
+ ));
}
Datum
-_ltq_regex(PG_FUNCTION_ARGS) {
- 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);
+_ltq_regex(PG_FUNCTION_ARGS)
+{
+ 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) {
- PG_RETURN_DATUM( DirectFunctionCall2( _ltq_regex,
- PG_GETARG_DATUM(1),
- PG_GETARG_DATUM(0)
- ) );
+_ltq_rregex(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_DATUM(DirectFunctionCall2(_ltq_regex,
+ PG_GETARG_DATUM(1),
+ PG_GETARG_DATUM(0)
+ ));
}
-Datum
-_ltxtq_exec(PG_FUNCTION_ARGS) {
- 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);
+Datum
+_ltxtq_exec(PG_FUNCTION_ARGS)
+{
+ 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_rexec(PG_FUNCTION_ARGS) {
- PG_RETURN_DATUM( DirectFunctionCall2( _ltxtq_exec,
- PG_GETARG_DATUM(1),
- PG_GETARG_DATUM(0)
- ) );
+_ltxtq_rexec(PG_FUNCTION_ARGS)
+{
+ PG_RETURN_DATUM(DirectFunctionCall2(_ltxtq_exec,
+ PG_GETARG_DATUM(1),
+ PG_GETARG_DATUM(0)
+ ));
}
-Datum
-_ltree_extract_isparent(PG_FUNCTION_ARGS) {
- 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);
+Datum
+_ltree_extract_isparent(PG_FUNCTION_ARGS)
+{
+ 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( found->len );
- memcpy( item, found, found->len );
-
- PG_FREE_IF_COPY(la,0);
- PG_FREE_IF_COPY(query,1);
+ item = (ltree *) palloc(found->len);
+ memcpy(item, found, found->len);
+
+ PG_FREE_IF_COPY(la, 0);
+ PG_FREE_IF_COPY(query, 1);
PG_RETURN_POINTER(item);
}
-Datum
-_ltree_extract_risparent(PG_FUNCTION_ARGS) {
- 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);
+Datum
+_ltree_extract_risparent(PG_FUNCTION_ARGS)
+{
+ 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( found->len );
- memcpy( item, found, found->len );
-
- PG_FREE_IF_COPY(la,0);
- PG_FREE_IF_COPY(query,1);
+ item = (ltree *) palloc(found->len);
+ memcpy(item, found, found->len);
+
+ PG_FREE_IF_COPY(la, 0);
+ PG_FREE_IF_COPY(query, 1);
PG_RETURN_POINTER(item);
}
-Datum
-_ltq_extract_regex(PG_FUNCTION_ARGS) {
- 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);
+Datum
+_ltq_extract_regex(PG_FUNCTION_ARGS)
+{
+ 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( found->len );
- memcpy( item, found, found->len );
-
- PG_FREE_IF_COPY(la,0);
- PG_FREE_IF_COPY(query,1);
+ item = (ltree *) palloc(found->len);
+ memcpy(item, found, found->len);
+
+ PG_FREE_IF_COPY(la, 0);
+ PG_FREE_IF_COPY(query, 1);
PG_RETURN_POINTER(item);
}
-Datum
-_ltxtq_extract_exec(PG_FUNCTION_ARGS) {
- 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);
+Datum
+_ltxtq_extract_exec(PG_FUNCTION_ARGS)
+{
+ 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( found->len );
- memcpy( item, found, found->len );
-
- PG_FREE_IF_COPY(la,0);
- PG_FREE_IF_COPY(query,1);
+ item = (ltree *) palloc(found->len);
+ memcpy(item, found, found->len);
+
+ PG_FREE_IF_COPY(la, 0);
+ PG_FREE_IF_COPY(query, 1);
PG_RETURN_POINTER(item);
}
Datum
-_lca(PG_FUNCTION_ARGS) {
- 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;
-
- a=(ltree**)palloc( sizeof(ltree*) * num );
- while( num>0 ) {
+_lca(PG_FUNCTION_ARGS)
+{
+ 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;
+
+ 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)));
+ res = lca_inner(a, ArrayGetNItems(ARR_NDIM(la), ARR_DIMS(la)));
pfree(a);
- PG_FREE_IF_COPY(la,0);
+ PG_FREE_IF_COPY(la, 0);
- if ( res )
- PG_RETURN_POINTER(res);
- else
- PG_RETURN_NULL();
+ if (res)
+ PG_RETURN_POINTER(res);
+ else
+ PG_RETURN_NULL();
}
-