PostgreSQL Source Code git master
Loading...
Searching...
No Matches
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 Int32GetDatum(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:1320
static bool DatumGetBool(Datum X)
Definition postgres.h:100
static Datum UInt16GetDatum(uint16 X)
Definition postgres.h:192
static Datum Int32GetDatum(int32 X)
Definition postgres.h:212
#define PointerGetDatum(X)
Definition postgres.h:354

References DatumGetBool(), FunctionCall8Coll(), Int32GetDatum(), PointerGetDatum, and UInt16GetDatum().

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 Int32GetDatum(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:1286
static GinTernaryValue DatumGetGinTernaryValue(Datum X)
Definition gin.h:81

References DatumGetGinTernaryValue(), FunctionCall7Coll(), Int32GetDatum(), PointerGetDatum, and UInt16GetDatum().

Referenced by ginInitConsistentFunction().

◆ ginInitConsistentFunction()

void ginInitConsistentFunction ( GinState ginstate,
GinScanKey  key 
)

Definition at line 228 of file ginlogic.c.

229{
230 if (key->searchMode == GIN_SEARCH_MODE_EVERYTHING)
231 {
232 key->boolConsistentFn = trueConsistentFn;
233 key->triConsistentFn = trueTriConsistentFn;
234 }
235 else
236 {
237 key->consistentFmgrInfo = &ginstate->consistentFn[key->attnum - 1];
238 key->triConsistentFmgrInfo = &ginstate->triConsistentFn[key->attnum - 1];
239 key->collation = ginstate->supportCollation[key->attnum - 1];
240
241 if (OidIsValid(ginstate->consistentFn[key->attnum - 1].fn_oid))
242 key->boolConsistentFn = directBoolConsistentFn;
243 else
244 key->boolConsistentFn = shimBoolConsistentFn;
245
246 if (OidIsValid(ginstate->triConsistentFn[key->attnum - 1].fn_oid))
247 key->triConsistentFn = directTriConsistentFn;
248 else
249 key->triConsistentFn = shimTriConsistentFn;
250 }
251}
#define OidIsValid(objectId)
Definition c.h:917
#define GIN_SEARCH_MODE_EVERYTHING
Definition gin.h:39
static GinTernaryValue trueTriConsistentFn(GinScanKey key)
Definition ginlogic.c:56
static GinTernaryValue shimTriConsistentFn(GinScanKey key)
Definition ginlogic.c:148
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:85
FmgrInfo consistentFn[INDEX_MAX_KEYS]
Definition gin_private.h:84
Oid supportCollation[INDEX_MAX_KEYS]
Definition gin_private.h:90

References GinState::consistentFn, directBoolConsistentFn(), directTriConsistentFn(), FmgrInfo::fn_oid, GIN_SEARCH_MODE_EVERYTHING, 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{
111
112 result = DatumGetGinTernaryValue(FunctionCall7Coll(key->triConsistentFmgrInfo,
113 key->collation,
114 PointerGetDatum(key->entryRes),
115 UInt16GetDatum(key->strategy),
116 key->query,
117 Int32GetDatum(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}
uint32 result
char GinTernaryValue
Definition gin.h:71
#define GIN_MAYBE
Definition gin.h:78

References DatumGetGinTernaryValue(), FunctionCall7Coll(), GIN_MAYBE, Int32GetDatum(), PointerGetDatum, result, and UInt16GetDatum().

Referenced by ginInitConsistentFunction().

◆ shimTriConsistentFn()

static GinTernaryValue shimTriConsistentFn ( GinScanKey  key)
static

Definition at line 148 of file ginlogic.c.

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

References directBoolConsistentFn(), fb(), GIN_FALSE, GIN_MAYBE, GIN_TRUE, i, 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}

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().