/* * reloptions processor for BRIN indexes */ bytea * brinoptions(Datum reloptions, bool validate) { relopt_value *options; BrinOptions *rdopts; int numoptions; static const relopt_parse_elt tab[] = { {"pages_per_range", RELOPT_TYPE_INT, offsetof(BrinOptions, pagesPerRange)} }; options = parseRelOptions(reloptions, validate, RELOPT_KIND_BRIN, &numoptions); /* if none set, we're done */ if (numoptions == 0) return NULL; rdopts = allocateReloptStruct(sizeof(BrinOptions), options, numoptions); fillRelOptions((void *) rdopts, sizeof(BrinOptions), options, numoptions, validate, tab, lengthof(tab)); pfree(options); return (bytea *) rdopts; }
/* * Initialize options for bloom index. */ bytea * bloptions(Datum reloptions, bool validate) { relopt_value *options; int numoptions; BloomOptions *rdopts; relopt_parse_elt tab[INDEX_MAX_KEYS + 1]; int i; char buf[16]; /* Option for length of signature */ tab[0].optname = "length"; tab[0].opttype = RELOPT_TYPE_INT; tab[0].offset = offsetof(BloomOptions, bloomLength); /* Number of bits for each of possible columns: col1, col2, ... */ for (i = 0; i < INDEX_MAX_KEYS; i++) { snprintf(buf, sizeof(buf), "col%d", i + 1); tab[i + 1].optname = pstrdup(buf); tab[i + 1].opttype = RELOPT_TYPE_INT; tab[i + 1].offset = offsetof(BloomOptions, bitSize[i]); } options = parseRelOptions(reloptions, validate, bl_relopt_kind, &numoptions); rdopts = allocateReloptStruct(sizeof(BloomOptions), options, numoptions); fillRelOptions((void *) rdopts, sizeof(BloomOptions), options, numoptions, validate, tab, INDEX_MAX_KEYS + 1); adjustBloomOptions(rdopts); return (bytea *) rdopts; }
bytea * gistoptions(Datum reloptions, bool validate) { relopt_value *options; GiSTOptions *rdopts; int numoptions; static const relopt_parse_elt tab[] = { {"fillfactor", RELOPT_TYPE_INT, offsetof(GiSTOptions, fillfactor)}, {"buffering", RELOPT_TYPE_STRING, offsetof(GiSTOptions, bufferingModeOffset)} }; options = parseRelOptions(reloptions, validate, RELOPT_KIND_GIST, &numoptions); /* if none set, we're done */ if (numoptions == 0) return NULL; rdopts = allocateReloptStruct(sizeof(GiSTOptions), options, numoptions); fillRelOptions((void *) rdopts, sizeof(GiSTOptions), options, numoptions, validate, tab, lengthof(tab)); pfree(options); return (bytea *) rdopts; }
Datum ginoptions(PG_FUNCTION_ARGS) { Datum reloptions = PG_GETARG_DATUM(0); bool validate = PG_GETARG_BOOL(1); relopt_value *options; GinOptions *rdopts; int numoptions; static const relopt_parse_elt tab[] = { {"fastupdate", RELOPT_TYPE_BOOL, offsetof(GinOptions, useFastUpdate)} }; options = parseRelOptions(reloptions, validate, RELOPT_KIND_GIN, &numoptions); /* if none set, we're done */ if (numoptions == 0) PG_RETURN_NULL(); rdopts = allocateReloptStruct(sizeof(GinOptions), options, numoptions); fillRelOptions((void *) rdopts, sizeof(GinOptions), options, numoptions, validate, tab, lengthof(tab)); pfree(options); PG_RETURN_BYTEA_P(rdopts); }
Datum bloptions(PG_FUNCTION_ARGS) { Datum reloptions = PG_GETARG_DATUM(0); bool validate = PG_GETARG_BOOL(1); relopt_value *options; int numoptions; BloomOptions *rdopts; relopt_parse_elt tab[INDEX_MAX_KEYS+1]; int i; char buf[16]; tab[0].optname = "length"; tab[0].opttype = RELOPT_TYPE_INT; tab[0].offset = offsetof(BloomOptions, bloomLength); for(i=0;i<INDEX_MAX_KEYS;i++) { snprintf(buf, sizeof(buf), "col%d", i+1); tab[i+1].optname = pstrdup(buf); tab[i+1].opttype = RELOPT_TYPE_INT; tab[i+1].offset = offsetof(BloomOptions, bitSize[i]); } options = parseRelOptions(reloptions, validate, bloom_kind, &numoptions); rdopts = allocateReloptStruct(sizeof(BloomOptions), options, numoptions); fillRelOptions((void *) rdopts, sizeof(BloomOptions), options, numoptions, validate, tab, INDEX_MAX_KEYS+1); rdopts = makeDefaultBloomOptions(rdopts); PG_RETURN_BYTEA_P(rdopts); }
bytea * ginoptions(Datum reloptions, bool validate) { relopt_value *options; GinOptions *rdopts; int numoptions; static const relopt_parse_elt tab[] = { {"fastupdate", RELOPT_TYPE_BOOL, offsetof(GinOptions, useFastUpdate)}, {"gin_pending_list_limit", RELOPT_TYPE_INT, offsetof(GinOptions, pendingListCleanupSize)} }; options = parseRelOptions(reloptions, validate, RELOPT_KIND_GIN, &numoptions); /* if none set, we're done */ if (numoptions == 0) return NULL; rdopts = allocateReloptStruct(sizeof(GinOptions), options, numoptions); fillRelOptions((void *) rdopts, sizeof(GinOptions), options, numoptions, validate, tab, lengthof(tab)); pfree(options); return (bytea *) rdopts; }
Datum gistoptions(PG_FUNCTION_ARGS) { Datum reloptions = PG_GETARG_DATUM(0); bool validate = PG_GETARG_BOOL(1); relopt_value *options; GiSTOptions *rdopts; int numoptions; static const relopt_parse_elt tab[] = { {"fillfactor", RELOPT_TYPE_INT, offsetof(GiSTOptions, fillfactor)}, {"buffering", RELOPT_TYPE_STRING, offsetof(GiSTOptions, bufferingModeOffset)} }; options = parseRelOptions(reloptions, validate, RELOPT_KIND_GIST, &numoptions); /* if none set, we're done */ if (numoptions == 0) PG_RETURN_NULL(); rdopts = allocateReloptStruct(sizeof(GiSTOptions), options, numoptions); fillRelOptions((void *) rdopts, sizeof(GiSTOptions), options, numoptions, validate, tab, lengthof(tab)); pfree(options); PG_RETURN_BYTEA_P(rdopts); }
void parse_validate_reloptions(StdRdOptions *result, Datum reloptions, bool validate, relopt_kind kind) { relopt_value *options; int num_options; options = parseRelOptions(reloptions, validate, RELOPT_KIND_HEAP, &num_options); validate_and_adjust_options(result, options, num_options, kind, validate); free_options_deep(options, num_options); }
/* * Parse reloptions for bloom index, producing a BloomOptions struct. */ bytea * bloptions(Datum reloptions, bool validate) { relopt_value *options; int numoptions; BloomOptions *rdopts; /* Parse the user-given reloptions */ options = parseRelOptions(reloptions, validate, bl_relopt_kind, &numoptions); rdopts = allocateReloptStruct(sizeof(BloomOptions), options, numoptions); fillRelOptions((void *) rdopts, sizeof(BloomOptions), options, numoptions, validate, bl_relopt_tab, lengthof(bl_relopt_tab)); /* Convert signature length from # of bits to # to words, rounding up */ rdopts->bloomLength = (rdopts->bloomLength + SIGNWORDBITS - 1) / SIGNWORDBITS; return (bytea *) rdopts; }