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:95
static Datum PointerGetDatum(const void *X)
Definition: postgres.h:327
static Datum UInt16GetDatum(uint16 X)
Definition: postgres.h:197
static Datum UInt32GetDatum(uint32 X)
Definition: postgres.h:237

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:732
#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)
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:72

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