Datum hstore_in(PG_FUNCTION_ARGS) { HSParser state; int4 len, buflen, i; HStore *out; HEntry *entries; char *ptr; state.begin = PG_GETARG_CSTRING(0); parse_hstore(&state); if (state.pcur == 0) { freeHSParse(&state); len = CALCDATASIZE(0, 0); out = palloc(len); out->len = len; out->size = 0; PG_RETURN_POINTER(out); } state.pcur = uniquePairs(state.pairs, state.pcur, &buflen); len = CALCDATASIZE(state.pcur, buflen); out = palloc(len); out->len = len; out->size = state.pcur; entries = ARRPTR(out); ptr = STRPTR(out); for (i = 0; i < out->size; i++) { entries[i].keylen = state.pairs[i].keylen; entries[i].pos = ptr - STRPTR(out); memcpy(ptr, state.pairs[i].key, state.pairs[i].keylen); ptr += entries[i].keylen; entries[i].valisnull = state.pairs[i].isnull; if (entries[i].valisnull) entries[i].vallen = 4; /* null */ else { entries[i].vallen = state.pairs[i].vallen; memcpy(ptr, state.pairs[i].val, state.pairs[i].vallen); ptr += entries[i].vallen; } } freeHSParse(&state); PG_RETURN_POINTER(out); }
Datum hstore_in(PG_FUNCTION_ARGS) { HSParser state; int4 buflen; HStore *out; state.begin = PG_GETARG_CSTRING(0); parse_hstore(&state); state.pcur = hstoreUniquePairs(state.pairs, state.pcur, &buflen); out = hstorePairs(state.pairs, state.pcur, buflen); PG_RETURN_POINTER(out); }