Datum
ginarraytriconsistent(PG_FUNCTION_ARGS)
{
- GinLogicValue *check = (GinLogicValue *) PG_GETARG_POINTER(0);
+ GinTernaryValue *check = (GinTernaryValue *) PG_GETARG_POINTER(0);
StrategyNumber strategy = PG_GETARG_UINT16(1);
/* ArrayType *query = PG_GETARG_ARRAYTYPE_P(2); */
/* Pointer *extra_data = (Pointer *) PG_GETARG_POINTER(4); */
/* Datum *queryKeys = (Datum *) PG_GETARG_POINTER(5); */
bool *nullFlags = (bool *) PG_GETARG_POINTER(6);
- GinLogicValue res;
+ GinTernaryValue res;
int32 i;
switch (strategy)
res = false;
}
- PG_RETURN_GIN_LOGIC_VALUE(res);
+ PG_RETURN_GIN_TERNARY_VALUE(res);
}
uint32 i;
bool haveLossyEntry;
GinScanEntry entry;
- GinLogicValue res;
+ GinTernaryValue res;
MemoryContext oldCtx;
bool allFinished;
key->recheckCurItem = false;
return true;
}
-static GinLogicValue
+static GinTernaryValue
trueTriConsistentFn(GinScanKey key)
{
return GIN_TRUE;
/*
* A helper function for calling a native ternary logic consistent function.
*/
-static GinLogicValue
+static GinTernaryValue
directTriConsistentFn(GinScanKey key)
{
- return DatumGetGinLogicValue(FunctionCall7Coll(key->triConsistentFmgrInfo,
- key->collation,
- PointerGetDatum(key->entryRes),
- UInt16GetDatum(key->strategy),
- key->query,
- UInt32GetDatum(key->nuserentries),
- PointerGetDatum(key->extra_data),
- PointerGetDatum(key->queryValues),
+ return DatumGetGinTernaryValue(FunctionCall7Coll(
+ key->triConsistentFmgrInfo,
+ key->collation,
+ PointerGetDatum(key->entryRes),
+ UInt16GetDatum(key->strategy),
+ key->query,
+ UInt32GetDatum(key->nuserentries),
+ PointerGetDatum(key->extra_data),
+ PointerGetDatum(key->queryValues),
PointerGetDatum(key->queryCategories)));
}
static bool
shimBoolConsistentFn(GinScanKey key)
{
- GinLogicValue result;
- result = DatumGetGinLogicValue(FunctionCall7Coll(key->triConsistentFmgrInfo,
- key->collation,
- PointerGetDatum(key->entryRes),
- UInt16GetDatum(key->strategy),
- key->query,
- UInt32GetDatum(key->nuserentries),
- PointerGetDatum(key->extra_data),
- PointerGetDatum(key->queryValues),
+ GinTernaryValue result;
+ result = DatumGetGinTernaryValue(FunctionCall7Coll(
+ key->triConsistentFmgrInfo,
+ key->collation,
+ PointerGetDatum(key->entryRes),
+ UInt16GetDatum(key->strategy),
+ key->query,
+ UInt32GetDatum(key->nuserentries),
+ PointerGetDatum(key->extra_data),
+ PointerGetDatum(key->queryValues),
PointerGetDatum(key->queryCategories)));
if (result == GIN_MAYBE)
{
*
* NB: This function modifies the key->entryRes array!
*/
-static GinLogicValue
+static GinTernaryValue
shimTriConsistentFn(GinScanKey key)
{
int nmaybe;
int i;
bool boolResult;
bool recheck = false;
- GinLogicValue curResult;
+ GinTernaryValue curResult;
/*
* Count how many MAYBE inputs there are, and store their indexes in
Datum
gin_triconsistent_jsonb(PG_FUNCTION_ARGS)
{
- GinLogicValue *check = (GinLogicValue *) PG_GETARG_POINTER(0);
+ GinTernaryValue *check = (GinTernaryValue *) PG_GETARG_POINTER(0);
StrategyNumber strategy = PG_GETARG_UINT16(1);
/* Jsonb *query = PG_GETARG_JSONB(2); */
int32 nkeys = PG_GETARG_INT32(3);
/* Pointer *extra_data = (Pointer *) PG_GETARG_POINTER(4); */
- GinLogicValue res = GIN_TRUE;
+ GinTernaryValue res = GIN_TRUE;
int32 i;
else
elog(ERROR, "unrecognized strategy number: %d", strategy);
- PG_RETURN_GIN_LOGIC_VALUE(res);
+ PG_RETURN_GIN_TERNARY_VALUE(res);
}
/*
Datum
gin_triconsistent_jsonb_hash(PG_FUNCTION_ARGS)
{
- GinLogicValue *check = (GinLogicValue *) PG_GETARG_POINTER(0);
+ GinTernaryValue *check = (GinTernaryValue *) PG_GETARG_POINTER(0);
StrategyNumber strategy = PG_GETARG_UINT16(1);
/* Jsonb *query = PG_GETARG_JSONB(2); */
int32 nkeys = PG_GETARG_INT32(3);
/* Pointer *extra_data = (Pointer *) PG_GETARG_POINTER(4); */
- GinLogicValue res = GIN_TRUE;
+ GinTernaryValue res = GIN_TRUE;
int32 i;
bool has_maybe = false;
if (!has_maybe && res == GIN_TRUE)
res = GIN_MAYBE;
- PG_RETURN_GIN_LOGIC_VALUE(res);
+ PG_RETURN_GIN_TERNARY_VALUE(res);
}
Datum
typedef struct
{
QueryItem *first_item;
- GinLogicValue *check;
+ GinTernaryValue *check;
int *map_item_operand;
bool *need_recheck;
} GinChkVal;
-static GinLogicValue
+static GinTernaryValue
checkcondition_gin(void *checkval, QueryOperand *val)
{
GinChkVal *gcv = (GinChkVal *) checkval;
* checkval can be used to pass information to the callback. TS_execute doesn't
* do anything with it.
*/
-static GinLogicValue
+static GinTernaryValue
TS_execute_ternary(QueryItem *curitem, void *checkval,
- GinLogicValue (*chkcond) (void *checkval, QueryOperand *val))
+ GinTernaryValue (*chkcond) (void *checkval, QueryOperand *val))
{
- GinLogicValue val1, val2, result;
+ GinTernaryValue val1, val2, result;
/* since this function recurses, it could be driven to stack overflow */
check_stack_depth();
Datum
gin_tsquery_triconsistent(PG_FUNCTION_ARGS)
{
- GinLogicValue *check = (GinLogicValue *) PG_GETARG_POINTER(0);
+ GinTernaryValue *check = (GinTernaryValue *) PG_GETARG_POINTER(0);
/* StrategyNumber strategy = PG_GETARG_UINT16(1); */
TSQuery query = PG_GETARG_TSQUERY(2);
/* int32 nkeys = PG_GETARG_INT32(3); */
Pointer *extra_data = (Pointer *) PG_GETARG_POINTER(4);
- GinLogicValue res = GIN_FALSE;
+ GinTernaryValue res = GIN_FALSE;
bool recheck;
/* The query requires recheck only if it involves weights */
res = GIN_MAYBE;
}
- PG_RETURN_GIN_LOGIC_VALUE(res);
+ PG_RETURN_GIN_TERNARY_VALUE(res);
}
/*
int32 ginVersion;
} GinStatsData;
-/* ginlogic.c */
-enum GinLogicValueEnum
-{
- GIN_FALSE = 0, /* item is not present / does not match */
- GIN_TRUE = 1, /* item is present / matches */
- GIN_MAYBE = 2 /* don't know if item is present / don't know if
- * matches */
-};
+/*
+ * A ternary value used by tri-consistent functions.
+ *
+ * For convenience, this is compatible with booleans. A boolean can be
+ * safely cast to a GinTernaryValue.
+ */
+typedef char GinTernaryValue;
-typedef char GinLogicValue;
+#define GIN_FALSE 0 /* item is not present / does not match */
+#define GIN_TRUE 1 /* item is present / matches */
+#define GIN_MAYBE 2 /* don't know if item is present / don't know if
+ * matches */
-#define DatumGetGinLogicValue(X) ((GinLogicValue)(X))
-#define GinLogicValueGetDatum(X) ((Datum)(X))
-#define PG_RETURN_GIN_LOGIC_VALUE(x) return GinLogicValueGetDatum(x)
+#define DatumGetGinTernaryValue(X) ((GinTernaryValue)(X))
+#define GinTernaryValueGetDatum(X) ((Datum)(X))
+#define PG_RETURN_GIN_TERNARY_VALUE(x) return GinTernaryValueGetDatum(x)
/* GUC parameter */
extern PGDLLIMPORT int GinFuzzySearchLimit;
/* array of check flags, reported to consistentFn */
bool *entryRes;
bool (*boolConsistentFn) (GinScanKey key);
- GinLogicValue (*triConsistentFn) (GinScanKey key);
+ GinTernaryValue (*triConsistentFn) (GinScanKey key);
FmgrInfo *consistentFmgrInfo;
FmgrInfo *triConsistentFmgrInfo;
Oid collation;