165
165
GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
166
166
text *query = PG_GETARG_TEXT_P(1);
167
168
/* StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2); */
168
169
/* Oid subtype = PG_GETARG_OID(3); */
169
170
bool *recheck = (bool *) PG_GETARG_POINTER(4);
170
171
TRGM *key = (TRGM *) DatumGetPointer(entry->key);
172
173
bool res = false;
173
char *cache = (char*) fcinfo->flinfo->fn_extra;
174
char *cache = (char *) fcinfo->flinfo->fn_extra;
175
176
/* All cases served by this function are exact */
176
177
*recheck = false;
178
if ( cache == NULL || VARSIZE(cache) != VARSIZE(query) || memcmp( cache, query, VARSIZE(query) ) !=0 )
179
if (cache == NULL || VARSIZE(cache) != VARSIZE(query) || memcmp(cache, query, VARSIZE(query)) != 0)
180
qtrg = generate_trgm(VARDATA(query), VARSIZE(query) - VARHDRSZ);
181
qtrg = generate_trgm(VARDATA(query), VARSIZE(query) - VARHDRSZ);
185
186
fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
186
MAXALIGN(VARSIZE(query)) + VARSIZE(qtrg) );
187
cache = (char*) fcinfo->flinfo->fn_extra;
187
MAXALIGN(VARSIZE(query)) + VARSIZE(qtrg));
188
cache = (char *) fcinfo->flinfo->fn_extra;
189
memcpy( cache, query, VARSIZE(query) );
190
memcpy( cache + MAXALIGN(VARSIZE(query)), qtrg, VARSIZE(qtrg) );
190
memcpy(cache, query, VARSIZE(query));
191
memcpy(cache + MAXALIGN(VARSIZE(query)), qtrg, VARSIZE(qtrg));
193
qtrg = (TRGM*)( cache + MAXALIGN(VARSIZE(query)) );
194
qtrg = (TRGM *) (cache + MAXALIGN(VARSIZE(query)));
195
196
if (GIST_LEAF(entry))
196
197
{ /* all leafs contains orig trgm */