diff options
author | Bruce Momjian <bruce@momjian.us> | 2003-02-19 03:50:09 +0000 |
---|---|---|
committer | Bruce Momjian <bruce@momjian.us> | 2003-02-19 03:50:09 +0000 |
commit | 71e1f531d36b1fb54d0fa2568c26c4f1f44cab3f (patch) | |
tree | e32ce7ccd6279c74a073178433fc569c31733669 /contrib/ltree/ltree_gist.c | |
parent | a286f7321083f06e395959dffeb9b87f028defa0 (diff) | |
download | postgresql-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.c | 30 |
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); } |