Datum ltree_same(PG_FUNCTION_ARGS) { ltree_gist *a = (ltree_gist *) PG_GETARG_POINTER(0); ltree_gist *b = (ltree_gist *) PG_GETARG_POINTER(1); bool *result = (bool *) PG_GETARG_POINTER(2); *result = false; if (LTG_ISONENODE(a) != LTG_ISONENODE(b)) PG_RETURN_POINTER(result); if (LTG_ISONENODE(a)) *result = (ISEQ(LTG_NODE(a), LTG_NODE(b))) ? true : false; else { int32 i; BITVECP sa = LTG_SIGN(a), sb = LTG_SIGN(b); if (LTG_ISALLTRUE(a) != LTG_ISALLTRUE(b)) PG_RETURN_POINTER(result); if (!ISEQ(LTG_LNODE(a), LTG_LNODE(b))) PG_RETURN_POINTER(result); if (!ISEQ(LTG_RNODE(a), LTG_RNODE(b))) PG_RETURN_POINTER(result); *result = true; if (!LTG_ISALLTRUE(a)) { LOOPBYTE { if (sa[i] != sb[i]) { *result = false; break; } } } }
Datum _ltree_compress(PG_FUNCTION_ARGS) { GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); GISTENTRY *retval = entry; if (entry->leafkey) { /* ltree */ ltree_gist *key; ArrayType *val = DatumGetArrayTypeP(entry->key); int4 len = LTG_HDRSIZE + ASIGLEN; int num = ArrayGetNItems(ARR_NDIM(val), ARR_DIMS(val)); ltree *item = (ltree *) ARR_DATA_PTR(val); if (ARR_NDIM(val) != 1) ereport(ERROR, (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR), errmsg("array must be one-dimensional"))); key = (ltree_gist *) palloc(len); key->len = len; key->flag = 0; MemSet(LTG_SIGN(key), 0, ASIGLEN); while (num > 0) { hashing(LTG_SIGN(key), item); num--; item = NEXTVAL(item); } retval = (GISTENTRY *) palloc(sizeof(GISTENTRY)); gistentryinit(*retval, PointerGetDatum(key), entry->rel, entry->page, entry->offset, key->len, FALSE); } else if (!LTG_ISALLTRUE(entry->key)) { int4 i, len; ltree_gist *key; BITVECP sign = LTG_SIGN(DatumGetPointer(entry->key)); ALOOPBYTE( if ((sign[i] & 0xff) != 0xff) PG_RETURN_POINTER(retval); );