3 #include "access/gin.h"
9 PG_FUNCTION_INFO_V1(gin_extract_hstore);
10 Datum gin_extract_hstore(PG_FUNCTION_ARGS);
13 makeitem(char *str, int len)
17 item = (text *) palloc(VARHDRSZ + len + 1);
18 SET_VARSIZE(item, VARHDRSZ + len + 1);
21 memcpy(VARDATA(item) + 1, str, len);
27 gin_extract_hstore(PG_FUNCTION_ARGS)
29 HStore *hs = PG_GETARG_HS(0);
30 int32 *nentries = (int32 *) PG_GETARG_POINTER(1);
31 Datum *entries = NULL;
33 *nentries = 2 * hs->size;
37 HEntry *ptr = ARRPTR(hs);
38 char *words = STRPTR(hs);
41 entries = (Datum *) palloc(sizeof(Datum) * 2 * hs->size);
43 while (ptr - ARRPTR(hs) < hs->size)
47 item = makeitem(words + ptr->pos, ptr->keylen);
48 *VARDATA(item) = KEYFLAG;
49 entries[i++] = PointerGetDatum(item);
53 item = makeitem(NULL, 0);
54 *VARDATA(item) = NULLFLAG;
59 item = makeitem(words + ptr->pos + ptr->keylen, ptr->vallen);
60 *VARDATA(item) = VALFLAG;
62 entries[i++] = PointerGetDatum(item);
68 PG_FREE_IF_COPY(hs, 0);
69 PG_RETURN_POINTER(entries);
72 PG_FUNCTION_INFO_V1(gin_extract_hstore_query);
73 Datum gin_extract_hstore_query(PG_FUNCTION_ARGS);
76 gin_extract_hstore_query(PG_FUNCTION_ARGS)
78 StrategyNumber strategy = PG_GETARG_UINT16(2);
80 if (strategy == HStoreContainsStrategyNumber)
82 PG_RETURN_DATUM(DirectFunctionCall2(
88 else if (strategy == HStoreExistsStrategyNumber)
91 *q = PG_GETARG_TEXT_P(0);
92 int32 *nentries = (int32 *) PG_GETARG_POINTER(1);
93 Datum *entries = NULL;
96 entries = (Datum *) palloc(sizeof(Datum));
98 item = makeitem(VARDATA(q), VARSIZE(q) - VARHDRSZ);
99 *VARDATA(item) = KEYFLAG;
100 entries[0] = PointerGetDatum(item);
102 PG_RETURN_POINTER(entries);
105 elog(ERROR, "Unsupported strategy number: %d", strategy);
107 PG_RETURN_POINTER(NULL);
110 PG_FUNCTION_INFO_V1(gin_consistent_hstore);
111 Datum gin_consistent_hstore(PG_FUNCTION_ARGS);
114 gin_consistent_hstore(PG_FUNCTION_ARGS)
116 StrategyNumber strategy = PG_GETARG_UINT16(1);
119 if (strategy == HStoreContainsStrategyNumber)
121 bool *check = (bool *) PG_GETARG_POINTER(0);
122 HStore *query = PG_GETARG_HS(2);
125 for (i = 0; res && i < 2 * query->size; i++)
126 if (check[i] == false)
129 else if (strategy == HStoreExistsStrategyNumber)
132 elog(ERROR, "Unsupported strategy number: %d", strategy);