aboutsummaryrefslogtreecommitdiff
path: root/contrib/ltree/ltree_gist.c
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2003-02-19 03:50:09 +0000
committerBruce Momjian <bruce@momjian.us>2003-02-19 03:50:09 +0000
commit71e1f531d36b1fb54d0fa2568c26c4f1f44cab3f (patch)
treee32ce7ccd6279c74a073178433fc569c31733669 /contrib/ltree/ltree_gist.c
parenta286f7321083f06e395959dffeb9b87f028defa0 (diff)
downloadpostgresql-71e1f531d36b1fb54d0fa2568c26c4f1f44cab3f.tar.gz
postgresql-71e1f531d36b1fb54d0fa2568c26c4f1f44cab3f.zip
Please apply patches for contrib/ltree.
ltree_73.patch.gz - for 7.3 : Fix ~ operation bug: eg '1.1.1' ~ '*.1' ltree_74.patch.gz - for current CVS Fix ~ operation bug: eg '1.1.1' ~ '*.1' Add ? operation Optimize index storage Last change needs drop/create all ltree indexes, so only for 7.4 Teodor Sigaev
Diffstat (limited to 'contrib/ltree/ltree_gist.c')
-rw-r--r--contrib/ltree/ltree_gist.c30
1 files changed, 29 insertions, 1 deletions
diff --git a/contrib/ltree/ltree_gist.c b/contrib/ltree/ltree_gist.c
index 5c5f4c7d6dc..41c92ac57b2 100644
--- a/contrib/ltree/ltree_gist.c
+++ b/contrib/ltree/ltree_gist.c
@@ -7,9 +7,11 @@
#include "access/gist.h"
#include "access/rtree.h"
#include "access/nbtree.h"
-
+#include "utils/array.h"
#include "crc32.h"
+#define NEXTVAL(x) ( (lquery*)( (char*)(x) + INTALIGN( VARSIZE(x) ) ) )
+
PG_FUNCTION_INFO_V1(ltree_gist_in);
Datum ltree_gist_in(PG_FUNCTION_ARGS);
@@ -596,6 +598,22 @@ gist_qtxt(ltree_gist * key, ltxtquery * query)
);
}
+static bool
+arrq_cons(ltree_gist *key, ArrayType *_query) {
+ lquery *query = (lquery *) ARR_DATA_PTR(_query);
+ int num = ArrayGetNItems(ARR_NDIM(_query), ARR_DIMS(_query));
+
+ if (ARR_NDIM(_query) != 1)
+ elog(ERROR, "Dimension of array != 1");
+
+ while (num > 0) {
+ if ( gist_qe(key, query) && gist_between(key, query) )
+ return true;
+ num--;
+ query = NEXTVAL(query);
+ }
+ return false;
+}
Datum
ltree_consistent(PG_FUNCTION_ARGS)
@@ -672,6 +690,16 @@ ltree_consistent(PG_FUNCTION_ARGS)
else
res = gist_qtxt(key, (ltxtquery *) query);
break;
+ case 16:
+ case 17:
+ if (GIST_LEAF(entry))
+ res = DatumGetBool(DirectFunctionCall2(lt_q_regex,
+ PointerGetDatum(LTG_NODE(key)),
+ PointerGetDatum((ArrayType *) query)
+ ));
+ else
+ res = arrq_cons(key, (ArrayType *) query);
+ break;
default:
elog(ERROR, "Unknown StrategyNumber: %d", strategy);
}