PostgreSQL Source Code  git master
ginlogic.c File Reference
#include "postgres.h"
#include "access/gin_private.h"
Include dependency graph for ginlogic.c:

Go to the source code of this file.

Macros

#define MAX_MAYBE_ENTRIES   4
 

Functions

static bool trueConsistentFn (GinScanKey key)
 
static GinTernaryValue trueTriConsistentFn (GinScanKey key)
 
static bool directBoolConsistentFn (GinScanKey key)
 
static GinTernaryValue directTriConsistentFn (GinScanKey key)
 
static bool shimBoolConsistentFn (GinScanKey key)
 
static GinTernaryValue shimTriConsistentFn (GinScanKey key)
 
void ginInitConsistentFunction (GinState *ginstate, GinScanKey key)
 

Macro Definition Documentation

◆ MAX_MAYBE_ENTRIES

#define MAX_MAYBE_ENTRIES   4

Definition at line 44 of file ginlogic.c.

Function Documentation

◆ directBoolConsistentFn()

static bool directBoolConsistentFn ( GinScanKey  key)
static

Definition at line 65 of file ginlogic.c.

66 {
67  /*
68  * Initialize recheckCurItem in case the consistentFn doesn't know it
69  * should set it. The safe assumption in that case is to force recheck.
70  */
71  key->recheckCurItem = true;
72 
73  return DatumGetBool(FunctionCall8Coll(key->consistentFmgrInfo,
74  key->collation,
75  PointerGetDatum(key->entryRes),
76  UInt16GetDatum(key->strategy),
77  key->query,
78  UInt32GetDatum(key->nuserentries),
79  PointerGetDatum(key->extra_data),
80  PointerGetDatum(&key->recheckCurItem),
81  PointerGetDatum(key->queryValues),
82  PointerGetDatum(key->queryCategories)));
83 }
Datum FunctionCall8Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2, Datum arg3, Datum arg4, Datum arg5, Datum arg6, Datum arg7, Datum arg8)
Definition: fmgr.c:1318
static bool DatumGetBool(Datum X)
Definition: postgres.h:90
static Datum PointerGetDatum(const void *X)
Definition: postgres.h:322
static Datum UInt16GetDatum(uint16 X)
Definition: postgres.h:192
static Datum UInt32GetDatum(uint32 X)
Definition: postgres.h:232

References DatumGetBool(), FunctionCall8Coll(), sort-test::key, PointerGetDatum(), UInt16GetDatum(), and UInt32GetDatum().

Referenced by ginInitConsistentFunction(), and shimTriConsistentFn().

◆ directTriConsistentFn()

static GinTernaryValue directTriConsistentFn ( GinScanKey  key)
static

Definition at line 89 of file ginlogic.c.

90 {
91  return DatumGetGinTernaryValue(FunctionCall7Coll(key->triConsistentFmgrInfo,
92  key->collation,
93  PointerGetDatum(key->entryRes),
94  UInt16GetDatum(key->strategy),
95  key->query,
96  UInt32GetDatum(key->nuserentries),
97  PointerGetDatum(key->extra_data),
98  PointerGetDatum(key->queryValues),
99  PointerGetDatum(key->queryCategories)));
100 }
Datum FunctionCall7Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2, Datum arg3, Datum arg4, Datum arg5, Datum arg6, Datum arg7)
Definition: fmgr.c:1284
static GinTernaryValue DatumGetGinTernaryValue(Datum X)
Definition: gin.h:68

References DatumGetGinTernaryValue(), FunctionCall7Coll(), sort-test::key, PointerGetDatum(), UInt16GetDatum(), and UInt32GetDatum().

Referenced by ginInitConsistentFunction().

◆ ginInitConsistentFunction()

void ginInitConsistentFunction ( GinState ginstate,
GinScanKey  key 
)

Definition at line 217 of file ginlogic.c.

218 {
219  if (key->searchMode == GIN_SEARCH_MODE_EVERYTHING)
220  {
221  key->boolConsistentFn = trueConsistentFn;
222  key->triConsistentFn = trueTriConsistentFn;
223  }
224  else
225  {
226  key->consistentFmgrInfo = &ginstate->consistentFn[key->attnum - 1];
227  key->triConsistentFmgrInfo = &ginstate->triConsistentFn[key->attnum - 1];
228  key->collation = ginstate->supportCollation[key->attnum - 1];
229 
230  if (OidIsValid(ginstate->consistentFn[key->attnum - 1].fn_oid))
231  key->boolConsistentFn = directBoolConsistentFn;
232  else
233  key->boolConsistentFn = shimBoolConsistentFn;
234 
235  if (OidIsValid(ginstate->triConsistentFn[key->attnum - 1].fn_oid))
236  key->triConsistentFn = directTriConsistentFn;
237  else
238  key->triConsistentFn = shimTriConsistentFn;
239  }
240 }
#define OidIsValid(objectId)
Definition: c.h:775
#define GIN_SEARCH_MODE_EVERYTHING
Definition: gin.h:37
static GinTernaryValue trueTriConsistentFn(GinScanKey key)
Definition: ginlogic.c:56
static GinTernaryValue shimTriConsistentFn(GinScanKey key)
Definition: ginlogic.c:146
static GinTernaryValue directTriConsistentFn(GinScanKey key)
Definition: ginlogic.c:89
static bool trueConsistentFn(GinScanKey key)
Definition: ginlogic.c:50
static bool directBoolConsistentFn(GinScanKey key)
Definition: ginlogic.c:65
static bool shimBoolConsistentFn(GinScanKey key)
Definition: ginlogic.c:108
Oid fn_oid
Definition: fmgr.h:59
FmgrInfo triConsistentFn[INDEX_MAX_KEYS]
Definition: gin_private.h:83
FmgrInfo consistentFn[INDEX_MAX_KEYS]
Definition: gin_private.h:82
Oid supportCollation[INDEX_MAX_KEYS]
Definition: gin_private.h:88

References GinState::consistentFn, directBoolConsistentFn(), directTriConsistentFn(), FmgrInfo::fn_oid, GIN_SEARCH_MODE_EVERYTHING, sort-test::key, OidIsValid, shimBoolConsistentFn(), shimTriConsistentFn(), GinState::supportCollation, GinState::triConsistentFn, trueConsistentFn(), and trueTriConsistentFn().

Referenced by ginFillScanKey().

◆ shimBoolConsistentFn()

static bool shimBoolConsistentFn ( GinScanKey  key)
static

Definition at line 108 of file ginlogic.c.

109 {
110  GinTernaryValue result;
111 
112  result = DatumGetGinTernaryValue(FunctionCall7Coll(key->triConsistentFmgrInfo,
113  key->collation,
114  PointerGetDatum(key->entryRes),
115  UInt16GetDatum(key->strategy),
116  key->query,
117  UInt32GetDatum(key->nuserentries),
118  PointerGetDatum(key->extra_data),
119  PointerGetDatum(key->queryValues),
120  PointerGetDatum(key->queryCategories)));
121  if (result == GIN_MAYBE)
122  {
123  key->recheckCurItem = true;
124  return true;
125  }
126  else
127  {
128  key->recheckCurItem = false;
129  return result;
130  }
131 }
char GinTernaryValue
Definition: gin.h:58
#define GIN_MAYBE
Definition: gin.h:65

References DatumGetGinTernaryValue(), FunctionCall7Coll(), GIN_MAYBE, sort-test::key, PointerGetDatum(), UInt16GetDatum(), and UInt32GetDatum().

Referenced by ginInitConsistentFunction().

◆ shimTriConsistentFn()

static GinTernaryValue shimTriConsistentFn ( GinScanKey  key)
static

Definition at line 146 of file ginlogic.c.

147 {
148  int nmaybe;
149  int maybeEntries[MAX_MAYBE_ENTRIES];
150  int i;
151  bool boolResult;
152  bool recheck = false;
153  GinTernaryValue curResult;
154 
155  /*
156  * Count how many MAYBE inputs there are, and store their indexes in
157  * maybeEntries. If there are too many MAYBE inputs, it's not feasible to
158  * test all combinations, so give up and return MAYBE.
159  */
160  nmaybe = 0;
161  for (i = 0; i < key->nentries; i++)
162  {
163  if (key->entryRes[i] == GIN_MAYBE)
164  {
165  if (nmaybe >= MAX_MAYBE_ENTRIES)
166  return GIN_MAYBE;
167  maybeEntries[nmaybe++] = i;
168  }
169  }
170 
171  /*
172  * If none of the inputs were MAYBE, so we can just call consistent
173  * function as is.
174  */
175  if (nmaybe == 0)
176  return directBoolConsistentFn(key);
177 
178  /* First call consistent function with all the maybe-inputs set FALSE */
179  for (i = 0; i < nmaybe; i++)
180  key->entryRes[maybeEntries[i]] = GIN_FALSE;
181  curResult = directBoolConsistentFn(key);
182 
183  for (;;)
184  {
185  /* Twiddle the entries for next combination. */
186  for (i = 0; i < nmaybe; i++)
187  {
188  if (key->entryRes[maybeEntries[i]] == GIN_FALSE)
189  {
190  key->entryRes[maybeEntries[i]] = GIN_TRUE;
191  break;
192  }
193  else
194  key->entryRes[maybeEntries[i]] = GIN_FALSE;
195  }
196  if (i == nmaybe)
197  break;
198 
199  boolResult = directBoolConsistentFn(key);
200  recheck |= key->recheckCurItem;
201 
202  if (curResult != boolResult)
203  return GIN_MAYBE;
204  }
205 
206  /* TRUE with recheck is taken to mean MAYBE */
207  if (curResult == GIN_TRUE && recheck)
208  curResult = GIN_MAYBE;
209 
210  return curResult;
211 }
#define GIN_FALSE
Definition: gin.h:63
#define GIN_TRUE
Definition: gin.h:64
#define MAX_MAYBE_ENTRIES
Definition: ginlogic.c:44
int i
Definition: isn.c:73

References directBoolConsistentFn(), GIN_FALSE, GIN_MAYBE, GIN_TRUE, i, sort-test::key, and MAX_MAYBE_ENTRIES.

Referenced by ginInitConsistentFunction().

◆ trueConsistentFn()

static bool trueConsistentFn ( GinScanKey  key)
static

Definition at line 50 of file ginlogic.c.

51 {
52  key->recheckCurItem = false;
53  return true;
54 }

References sort-test::key.

Referenced by ginInitConsistentFunction().

◆ trueTriConsistentFn()

static GinTernaryValue trueTriConsistentFn ( GinScanKey  key)
static

Definition at line 56 of file ginlogic.c.

57 {
58  return GIN_TRUE;
59 }

References GIN_TRUE.

Referenced by ginInitConsistentFunction().