diff options
author | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2014-03-12 17:13:22 +0200 |
---|---|---|
committer | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2014-03-12 17:51:30 +0200 |
commit | c5608ea26a1f51998ad3cf987c3f0bda643c87a8 (patch) | |
tree | ea7370dc9696b18454f7102b3c26208455355d3c /src/include/access/gin.h | |
parent | fecfc2b913c4be5eeed24b32ef51a3239580bd1e (diff) |
Allow opclasses to provide tri-valued GIN consistent functions.
With the GIN "fast scan" feature, GIN can skip items without fetching all
the keys for them, if it can prove that they don't match regardless of
those keys. So far, it has done the proving by calling the boolean
consistent function with all combinations of TRUE/FALSE for the unfetched
keys, but since that's O(n^2), it becomes unfeasible with more than a few
keys. We can avoid calling consistent with all the combinations, if we can
tell the operator class implementation directly which keys are unknown.
This commit includes a triConsistent function for the built-in array and
tsvector opclasses.
Alexander Korotkov, with some changes by me.
Diffstat (limited to 'src/include/access/gin.h')
-rw-r--r-- | src/include/access/gin.h | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/src/include/access/gin.h b/src/include/access/gin.h index 03e58c9b1cb..75a86c4319a 100644 --- a/src/include/access/gin.h +++ b/src/include/access/gin.h @@ -23,7 +23,8 @@ #define GIN_EXTRACTQUERY_PROC 3 #define GIN_CONSISTENT_PROC 4 #define GIN_COMPARE_PARTIAL_PROC 5 -#define GINNProcs 5 +#define GIN_TRICONSISTENT_PROC 6 +#define GINNProcs 6 /* * searchMode settings for extractQueryFn. @@ -46,6 +47,21 @@ typedef struct GinStatsData int32 ginVersion; } GinStatsData; +/* ginlogic.c */ +enum +{ + GIN_FALSE = 0, /* item is present / matches */ + GIN_TRUE = 1, /* item is not present / does not match */ + GIN_MAYBE = 2 /* don't know if item is present / don't know if + * matches */ +} GinLogicValueEnum; + +typedef char GinLogicValue; + +#define DatumGetGinLogicValue(X) ((GinLogicValue)(X)) +#define GinLogicValueGetDatum(X) ((Datum)(X)) +#define PG_RETURN_GIN_LOGIC_VALUE(x) return GinLogicValueGetDatum(x) + /* GUC parameter */ extern PGDLLIMPORT int GinFuzzySearchLimit; |