|
1 | 1 | /*
|
2 |
| - * $PostgreSQL: pgsql/contrib/pg_trgm/trgm_gin.c,v 1.6 2008/11/12 13:43:54 teodor Exp $ |
| 2 | + * $PostgreSQL: pgsql/contrib/pg_trgm/trgm_gin.c,v 1.7 2009/03/25 22:19:01 tgl Exp $ |
3 | 3 | */
|
4 | 4 | #include "trgm.h"
|
5 | 5 |
|
@@ -47,53 +47,40 @@ gin_extract_trgm(PG_FUNCTION_ARGS)
|
47 | 47 |
|
48 | 48 | ptr++;
|
49 | 49 | }
|
| 50 | + if (PG_NARGS() > 4) |
| 51 | + { |
| 52 | + /* |
| 53 | + * Function called from query extracting |
| 54 | + */ |
| 55 | + Pointer **extra_data = (Pointer **) PG_GETARG_POINTER(4); |
| 56 | + |
| 57 | + *extra_data = (Pointer*) palloc0(sizeof(Pointer)*(*nentries)); |
| 58 | + |
| 59 | + *(int32*)(*extra_data) = trglen; |
| 60 | + } |
50 | 61 | }
|
51 | 62 |
|
52 | 63 | PG_RETURN_POINTER(entries);
|
53 | 64 | }
|
54 | 65 |
|
55 |
| -/* |
56 |
| - * Per call strage for consistent functions to |
57 |
| - * cache computed value from query |
58 |
| - */ |
59 |
| -typedef struct PerCallConsistentStorage { |
60 |
| - int trglen; |
61 |
| - text data[1]; /* query */ |
62 |
| -} PerCallConsistentStorage; |
63 |
| -#define PCCSHDR_SZ offsetof(PerCallConsistentStorage, data) |
64 |
| - |
65 | 66 | Datum
|
66 | 67 | gin_trgm_consistent(PG_FUNCTION_ARGS)
|
67 | 68 | {
|
68 | 69 | bool *check = (bool *) PG_GETARG_POINTER(0);
|
69 | 70 | /* StrategyNumber strategy = PG_GETARG_UINT16(1); */
|
70 |
| - text *query = PG_GETARG_TEXT_P(2); |
71 |
| - bool *recheck = (bool *) PG_GETARG_POINTER(3); |
| 71 | + /* text *query = PG_GETARG_TEXT_P(2); */ |
| 72 | + /* int32 nkeys = PG_GETARG_INT32(3); */ |
| 73 | + Pointer *extra_data = (Pointer *) PG_GETARG_POINTER(4); |
| 74 | + bool *recheck = (bool *) PG_GETARG_POINTER(5); |
72 | 75 | bool res = FALSE;
|
73 | 76 | int4 i,
|
74 | 77 | trglen,
|
75 | 78 | ntrue = 0;
|
76 |
| - PerCallConsistentStorage *pccs = (PerCallConsistentStorage*) fcinfo->flinfo->fn_extra; |
77 | 79 |
|
78 | 80 | /* All cases served by this function are inexact */
|
79 | 81 | *recheck = true;
|
80 | 82 |
|
81 |
| - if ( pccs == NULL || VARSIZE(pccs->data) != VARSIZE(query) || memcmp( pccs->data, query, VARSIZE(query) ) !=0 ) |
82 |
| - { |
83 |
| - TRGM *trg = generate_trgm(VARDATA(query), VARSIZE(query) - VARHDRSZ); |
84 |
| - |
85 |
| - if ( pccs ) |
86 |
| - pfree(pccs); |
87 |
| - |
88 |
| - fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt, |
89 |
| - VARSIZE(query) + PCCSHDR_SZ); |
90 |
| - pccs = (PerCallConsistentStorage*) fcinfo->flinfo->fn_extra; |
91 |
| - |
92 |
| - pccs->trglen = ARRNELEM(trg); |
93 |
| - memcpy( pccs->data, query, VARSIZE(query) ); |
94 |
| - } |
95 |
| - |
96 |
| - trglen = pccs->trglen; |
| 83 | + trglen = *(int32*)extra_data; |
97 | 84 |
|
98 | 85 | for (i = 0; i < trglen; i++)
|
99 | 86 | if (check[i])
|
|
0 commit comments