Esempio n. 1
0
/*
 * Module Load Callback
 */
void
_PG_init(void)
{
	DefineCustomBoolVariable("call_graph.enable", "Enables real-time tracking of function calls.", "", &enable_call_graph, false, PGC_USERSET,
							 0, NULL, NULL, NULL);
	DefineCustomBoolVariable("call_graph.track_table_usage", "Enables tracking of per-callgraph table usage.", "Has no effect if call_graph.enable is not set.", &track_table_usage, false, PGC_USERSET,
							 0, NULL, NULL, NULL);

	/* Install our hooks */
	next_needs_fmgr_hook = needs_fmgr_hook;
	needs_fmgr_hook = call_graph_needs_fmgr_hook;

	next_fmgr_hook = fmgr_hook;
	fmgr_hook = call_graph_fmgr_hook;
}
Esempio n. 2
0
/*
 * _PG_init is called when the module is loaded. In this function we save the
 * previous utility hook, and then install our hook to pre-intercept calls to
 * the copy command.
 */
void
_PG_init(void)
{
	PreviousExecutorStartHook = ExecutorStart_hook;
	ExecutorStart_hook = PgPaxosExecutorStart;

	PreviousProcessUtilityHook = ProcessUtility_hook;
	ProcessUtility_hook = PgPaxosProcessUtility;

	DefineCustomBoolVariable("pg_paxos.enabled",
							 "If enabled, pg_paxos handles queries on Paxos tables",
							 NULL, &PaxosEnabled, true, PGC_USERSET, 0, NULL, NULL,
							 NULL);

	DefineCustomStringVariable("pg_paxos.node_id",
							   "Unique node ID to use in Paxos interactions", NULL,
							   &PaxosNodeId, NULL, PGC_USERSET, 0, NULL,
							   NULL, NULL);

	DefineCustomEnumVariable("pg_paxos.consistency_model",
							 "Consistency model to use for reads (strong, optimistic)",
							 NULL, &ReadConsistencyModel, STRONG_CONSISTENCY,
							 consistency_model_options, PGC_USERSET, 0, NULL, NULL,
							 NULL);

	RegisterXactCallback(FinishPaxosTransaction, NULL);
}
Esempio n. 3
0
void
init_runtime_append_static_data(void)
{
	runtimeappend_path_methods.CustomName				= RUNTIME_APPEND_NODE_NAME;
	runtimeappend_path_methods.PlanCustomPath			= create_runtime_append_plan;

	runtimeappend_plan_methods.CustomName 				= RUNTIME_APPEND_NODE_NAME;
	runtimeappend_plan_methods.CreateCustomScanState	= runtime_append_create_scan_state;

	runtimeappend_exec_methods.CustomName				= RUNTIME_APPEND_NODE_NAME;
	runtimeappend_exec_methods.BeginCustomScan			= runtime_append_begin;
	runtimeappend_exec_methods.ExecCustomScan			= runtime_append_exec;
	runtimeappend_exec_methods.EndCustomScan			= runtime_append_end;
	runtimeappend_exec_methods.ReScanCustomScan			= runtime_append_rescan;
	runtimeappend_exec_methods.MarkPosCustomScan		= NULL;
	runtimeappend_exec_methods.RestrPosCustomScan		= NULL;
	runtimeappend_exec_methods.ExplainCustomScan		= runtime_append_explain;

	DefineCustomBoolVariable("pg_pathman.enable_runtimeappend",
							 "Enables the planner's use of " RUNTIME_APPEND_NODE_NAME " custom node.",
							 NULL,
							 &pg_pathman_enable_runtimeappend,
							 true,
							 PGC_USERSET,
							 0,
							 NULL,
							 NULL,
							 NULL);

	RegisterCustomScanMethods(&runtimeappend_plan_methods);
}
Esempio n. 4
0
static void
pgstrom_init_misc_guc(void)
{
	/* GUC variables according to the device information */
	DefineCustomBoolVariable("pg_strom.enabled",
							 "Enables the planner's use of PG-Strom",
							 NULL,
							 &pgstrom_enabled,
							 true,
							 PGC_USERSET,
							 GUC_NOT_IN_SAMPLE,
							 NULL, NULL, NULL);
	DefineCustomBoolVariable("pg_strom.perfmon",
							 "Enables the performance monitor of PG-Strom",
							 NULL,
							 &pgstrom_perfmon_enabled,
							 false,
							 PGC_USERSET,
							 GUC_NOT_IN_SAMPLE,
							 NULL, NULL, NULL);
	DefineCustomIntVariable("pg_strom.min_async_chunks",
							"least number of chunks to be run asynchronously",
							NULL,
							&pgstrom_min_async_chunks,
							2,
							2,
							INT_MAX,
							PGC_USERSET,
							GUC_NOT_IN_SAMPLE,
							NULL, NULL, NULL);
	DefineCustomIntVariable("pg_strom.max_async_chunks",
							"max number of chunk to be run asynchronously",
							NULL,
							&pgstrom_max_async_chunks,
							32,
							pgstrom_min_async_chunks + 1,
							INT_MAX,
							PGC_USERSET,
							GUC_NOT_IN_SAMPLE,
							NULL, NULL, NULL);
	if (pgstrom_max_async_chunks <= pgstrom_min_async_chunks)
		ereport(ERROR,
				(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
				 errmsg("\"pg_strom.max_async_chunks\" must be larger than \"pg_strom.min_async_chunks\"")));
}
Esempio n. 5
0
void zdb_index_init(void) {
    RELOPT_KIND_ZDB = add_reloption_kind();

    add_string_reloption(RELOPT_KIND_ZDB, "url", "Server URL and port", NULL, validate_url);
    add_string_reloption(RELOPT_KIND_ZDB, "shadow", "A zombodb index to which this one should shadow", NULL, validate_shadow);
    add_string_reloption(RELOPT_KIND_ZDB, "options", "Comma-separated list of options to pass to underlying index", NULL, validate_options);
    add_string_reloption(RELOPT_KIND_ZDB, "preference", "The ?preference value used to Elasticsearch", NULL, validate_preference);
    add_string_reloption(RELOPT_KIND_ZDB, "refresh_interval", "Frequency in which Elasticsearch indexes are refreshed.  Related to ES' index.refresh_interval setting", "-1", validate_refresh_interval);
    add_int_reloption(RELOPT_KIND_ZDB, "shards", "The number of shared for the index", 5, 1, ZDB_MAX_SHARDS);
    add_int_reloption(RELOPT_KIND_ZDB, "replicas", "The default number of replicas for the index", 1, 0, ZDB_MAX_REPLICAS);
    add_int_reloption(RELOPT_KIND_ZDB, "bulk_concurrency", "The maximum number of concurrent _bulk API requests", 12, 1, ZDB_MAX_BULK_CONCURRENCY);
	add_int_reloption(RELOPT_KIND_ZDB, "batch_size", "The size in bytes of batch calls to the _bulk API", 1024 * 1024 * 8, 1024, (INT32_MAX/2)-1);
    add_string_reloption(RELOPT_KIND_ZDB, "field_lists", "field=[field1, field2, field3], other=[field4,field5]", NULL, validate_field_lists);
    add_bool_reloption(RELOPT_KIND_ZDB, "ignore_visibility", "Should queries that require visibility information actually use it?", false);
    add_bool_reloption(RELOPT_KIND_ZDB, "always_resolve_joins", "Should queries that link to other indexes always resolve the links", false);

    DefineCustomBoolVariable("zombodb.batch_mode", "Batch INSERT/UPDATE/COPY changes until transaction commit", NULL, &zdb_batch_mode_guc, false, PGC_USERSET, 0, NULL, NULL, NULL);
    DefineCustomBoolVariable("zombodb.ignore_visibility", "If true, visibility information will be ignored for all queries", NULL, &zdb_ignore_visibility_guc, false, PGC_USERSET, 0, NULL, NULL, NULL);
}
Esempio n. 6
0
/*
 * initialization of debugging facilities
 */
void
pgstrom_init_debug(void)
{
	/* turn on/off kernel device debug support */
	DefineCustomBoolVariable("pg_strom.kernel_debug",
							 "turn on/off kernel debug support",
							 NULL,
							 &pgstrom_kernel_debug,
							 false,
							 PGC_SUSET,
							 GUC_NOT_IN_SAMPLE,
							 NULL, NULL, NULL);
}
Esempio n. 7
0
void _PG_init(void)
{
	PLpgSQL_plugin ** var_ptr = (PLpgSQL_plugin **) find_rendezvous_variable( "PLpgSQL_plugin" );

	/* Be sure we do initialization only once (should be redundant now) */
	static bool inited = false;

	if (inited)
		return;

	*var_ptr = &plugin_funcs;

#if PG_VERSION_NUM >= 90100

	DefineCustomBoolVariable("plpgsql.enable_lint",
					    "when is true, then plpgsql_lint is active",
					    NULL,
					    &plpgsql_lint_enable,
					    true,
					    PGC_SUSET, 0,
					    NULL, NULL, NULL);

#else

	DefineCustomBoolVariable("plpgsql.enable_lint",
					    "when is true, then plpgsql_lint is active",
					    NULL,
					    &plpgsql_lint_enable,
					    true,
					    PGC_SUSET, 0,
					    NULL, NULL);

#endif

	inited = true;
}
Esempio n. 8
0
/* Declare the parameters */
static void
DefineGUCs(void)
{
	DefineCustomBoolVariable("pg_hibernator.enabled",
							"Enable/disable automatic hibernation.",
							NULL,
							&guc_enabled,
							guc_enabled,
							PGC_SIGHUP,
							0,
							NULL,
							NULL,
							NULL);

	DefineCustomBoolVariable("pg_hibernator.parallel",
							"Enable/disable restoring databases in parallel.",
							NULL,
							&guc_parallel_enabled,
							guc_parallel_enabled,
							PGC_SIGHUP,
							0,
							NULL,
							NULL,
							NULL);

	DefineCustomStringVariable("pg_hibernator.default_database",
							"Database to connect to, by default.",
							"Postgres Hibernator will connect to this database when saving buffers, and when reading blocks of global objects.",
							&guc_default_database,
							guc_default_database,
							PGC_POSTMASTER,
							0,
							NULL,
							NULL,
							NULL);
}
Esempio n. 9
0
/* Define custom GUC */
static void
load_parameters()
{
	DefineCustomBoolVariable("saio",
							 "Use SA for query planning.", NULL,
							 &enable_saio, true,
							 PGC_USERSET,
							 0, SAIO_GUC_HOOK_VALUES);

	DefineCustomIntVariable("saio_threshold",
							"Sets the threshold of FROM items beyond which SAIO is used.", NULL,
							&saio_threshold, 14, 1, INT_MAX,
							PGC_USERSET,
							0, SAIO_GUC_HOOK_VALUES);

	DefineCustomRealVariable("saio_seed",
							 "SA random seed.", NULL,
							 &saio_seed, 0.0, 0.0, 1.0,
							 PGC_USERSET,
							 0, SAIO_GUC_HOOK_VALUES);

	DefineCustomIntVariable("saio_equilibrium_factor",
							"SA scaling factor for reaching equilibirum.", NULL,
							&saio_equilibrium_factor, 16, 1, INT_MAX,
							PGC_USERSET,
							0, SAIO_GUC_HOOK_VALUES);

	DefineCustomRealVariable("saio_initial_temperature_factor",
							 "SA scaling factor for initial temperature.", NULL,
							 &saio_initial_temperature_factor, 2.0, 0.0, 10.0,
							 PGC_USERSET,
							 0, SAIO_GUC_HOOK_VALUES);

	DefineCustomRealVariable("saio_temperature_reduction_factor",
							 "SA temperature reduction factor.", NULL,
							 &saio_temperature_reduction_factor, 0.9, 0.0, 1.0,
							 PGC_USERSET,
							 0, SAIO_GUC_HOOK_VALUES);

	DefineCustomIntVariable("saio_moves_before_frozen",
							"SA moves before considering system frozen.", NULL,
							&saio_moves_before_frozen, 4, 1, INT_MAX,
							PGC_USERSET,
							0, SAIO_GUC_HOOK_VALUES);	
}
Esempio n. 10
0
void
plperl_init(void)
{
	if (!plperl_firstcall)
		return;

	DefineCustomBoolVariable(
							 "plperl.use_strict",
	  "If true, will compile trusted and untrusted perl code in strict mode",
							 NULL,
							 &plperl_use_strict,
							 PGC_USERSET,
							 NULL, NULL);

	EmitWarningsOnPlaceholders("plperl");

	plperl_init_interp();
	plperl_firstcall = 0;
}
Esempio n. 11
0
void
_PG_init(void)
{
        /*  Define custom GUC variables. */
        DefineCustomBoolVariable("dblink_plus.use_xa",
                                                           "Parameter used for dblink_plus.",
                                                           NULL,
                                                           &use_xa,
                                                           true,
                                                           PGC_USERSET,
                                                           0,
#if PG_VERSION_NUM >= 90100
                                                           NULL,
#endif
                                                           NULL, NULL);

      EmitWarningsOnPlaceholders("dblink_plus");

      srandom((unsigned int) time(NULL));

}
Esempio n. 12
0
/*
 * _PG_init()			- library load-time initialization
 *
 * DO NOT make this static nor change its name!
 */
void
_PG_init(void)
{
	/* Be sure we do initialization only once (should be redundant now) */
	static bool inited = false;

	if (inited)
		return;

	pg_bindtextdomain(TEXTDOMAIN);

	DefineCustomEnumVariable("plpgsql.variable_conflict",
							 gettext_noop("Sets handling of conflicts between PL/pgSQL variable names and table column names."),
							 NULL,
							 &plpgsql_variable_conflict,
							 PLPGSQL_RESOLVE_ERROR,
							 variable_conflict_options,
							 PGC_SUSET, 0,
							 NULL, NULL, NULL);

	DefineCustomBoolVariable("plpgsql.print_strict_params",
							 gettext_noop("Print information about parameters in the DETAIL part of the error messages generated on INTO .. STRICT failures."),
							 NULL,
							 &plpgsql_print_strict_params,
							 false,
							 PGC_USERSET, 0,
							 NULL, NULL, NULL);

	EmitWarningsOnPlaceholders("plpgsql");

	plpgsql_HashTableInit();
	RegisterXactCallback(plpgsql_xact_cb, NULL);
	RegisterSubXactCallback(plpgsql_subxact_cb, NULL);

	/* Set up a rendezvous point with optional instrumentation plugin */
	plugin_ptr = (PLpgSQL_plugin **) find_rendezvous_variable("PLpgSQL_plugin");

	inited = true;
}
Esempio n. 13
0
/*
 * Module load callback
 */
void
_PG_init(void)
{
	if (zhprs_scws)
		return;

	zhprs_init();

	DefineCustomBoolVariable("zhparser.dict_in_memory",
							 "load dicts into memory",
							 NULL,
							 &zhprs_dict_in_memory,
							 false,
							 PGC_BACKEND,
							 0,
							 NULL,
							 zhprs_assign_dict_in_memory,
							 NULL);
	DefineCustomStringVariable("zhparser.charset",
							   "charset",
							   NULL,
							   &zhprs_charset,
							   "utf8",
							   PGC_USERSET,
							   0,
							   zhprs_check_charset,
							   zhprs_assign_charset,
							   NULL);
	DefineCustomStringVariable("zhparser.rules",
							   "rules to load",
							   NULL,
							   &zhprs_rules,
							   "rules.utf8.ini",
							   PGC_USERSET,
							   0,
							   zhprs_check_rules,
							   zhprs_assign_rules,
							   NULL);
	DefineCustomStringVariable("zhparser.extra_dicts",
							   "extra dicts files to load",
							   NULL,
							   &zhprs_extra_dicts,
							   "dict.utf8.xdb",
							   PGC_USERSET,
							   0,
							   zhprs_check_extra_dicts,
							   zhprs_assign_extra_dicts,
							   NULL);

	DefineCustomBoolVariable("zhparser.punctuation_ignore",
							 "set if zhparser ignores the puncuation",
							 "set if zhparser ignores the puncuation, except \\r and \\n",
							 &zhprs_punctuation_ignore,
							 false,
							 PGC_USERSET,
							 0,
							 NULL,
							 NULL,
							 NULL);
	DefineCustomBoolVariable("zhparser.seg_with_duality",
							 "segment words with duality",
							 NULL,
							 &zhprs_seg_with_duality,
							 false,
							 PGC_USERSET,
							 0,
							 NULL,
							 NULL,
							 NULL);
	DefineCustomStringVariable("zhparser.multi_mode",
							   "set multi mode",
							   "short for prefer short words\n"
							   "duality for prefer duality\n"
							   "zmain prefer most important element"
							   "zall prefer prefer all element",
							   &zhprs_multi_mode_string,
							   NULL,
							   PGC_USERSET,
							   0,
							   zhprs_check_multi_mode,
							   zhprs_assign_multi_mode,
							   NULL);
}
Esempio n. 14
0
/*
 * Module load callback
 */
void
_PG_init(void)
{
	/* Define custom GUC variables. */
	DefineCustomIntVariable("auto_explain.log_min_duration",
		 "Sets the minimum execution time above which plans will be logged.",
						 "Zero prints all plans. -1 turns this feature off.",
							&auto_explain_log_min_duration,
							-1,
							-1, INT_MAX / 1000,
							PGC_SUSET,
							GUC_UNIT_MS,
							NULL,
							NULL,
							NULL);

	DefineCustomBoolVariable("auto_explain.log_analyze",
							 "Use EXPLAIN ANALYZE for plan logging.",
							 NULL,
							 &auto_explain_log_analyze,
							 false,
							 PGC_SUSET,
							 0,
							 NULL,
							 NULL,
							 NULL);

	DefineCustomBoolVariable("auto_explain.log_verbose",
							 "Use EXPLAIN VERBOSE for plan logging.",
							 NULL,
							 &auto_explain_log_verbose,
							 false,
							 PGC_SUSET,
							 0,
							 NULL,
							 NULL,
							 NULL);

	DefineCustomBoolVariable("auto_explain.log_buffers",
							 "Log buffers usage.",
							 NULL,
							 &auto_explain_log_buffers,
							 false,
							 PGC_SUSET,
							 0,
							 NULL,
							 NULL,
							 NULL);

	DefineCustomBoolVariable("auto_explain.log_triggers",
							 "Include trigger statistics in plans.",
						"This has no effect unless log_analyze is also set.",
							 &auto_explain_log_triggers,
							 false,
							 PGC_SUSET,
							 0,
							 NULL,
							 NULL,
							 NULL);

	DefineCustomEnumVariable("auto_explain.log_format",
							 "EXPLAIN format to be used for plan logging.",
							 NULL,
							 &auto_explain_log_format,
							 EXPLAIN_FORMAT_TEXT,
							 format_options,
							 PGC_SUSET,
							 0,
							 NULL,
							 NULL,
							 NULL);

	DefineCustomBoolVariable("auto_explain.log_nested_statements",
							 "Log nested statements.",
							 NULL,
							 &auto_explain_log_nested_statements,
							 false,
							 PGC_SUSET,
							 0,
							 NULL,
							 NULL,
							 NULL);

	DefineCustomBoolVariable("auto_explain.log_timing",
							 "Collect timing data, not just row counts.",
							 NULL,
							 &auto_explain_log_timing,
							 true,
							 PGC_SUSET,
							 0,
							 NULL,
							 NULL,
							 NULL);

	DefineCustomRealVariable("auto_explain.sample_rate",
							 "Fraction of queries to process.",
							 NULL,
							 &auto_explain_sample_rate,
							 1.0,
							 0.0,
							 1.0,
							 PGC_SUSET,
							 0,
							 NULL,
							 NULL,
							 NULL);

	EmitWarningsOnPlaceholders("auto_explain");

	/* Install hooks. */
	prev_ExecutorStart = ExecutorStart_hook;
	ExecutorStart_hook = explain_ExecutorStart;
	prev_ExecutorRun = ExecutorRun_hook;
	ExecutorRun_hook = explain_ExecutorRun;
	prev_ExecutorFinish = ExecutorFinish_hook;
	ExecutorFinish_hook = explain_ExecutorFinish;
	prev_ExecutorEnd = ExecutorEnd_hook;
	ExecutorEnd_hook = explain_ExecutorEnd;
}
Esempio n. 15
0
/*
 * Module load callback
 */
void
_PG_init(void)
{
    
    /* can be preloaded only from postgresql.conf */
    if (!process_shared_preload_libraries_in_progress)
        return;
    
    /* Define custom GUC variables. */
    DefineCustomStringVariable("query_recorder.filename",
                               "Base filename to write the recorded queries.",
                             NULL,
                             &base_filename,
                             false,
                             PGC_BACKEND,
                             0,
#if (PG_VERSION_NUM >= 90100)
                             NULL,
#endif
                             NULL,
                             NULL);
    
    DefineCustomIntVariable("query_recorder.max_files",
                            "How many files will be rotated.",
                             NULL,
                             &max_files,
                             100,
                             1, 1000,
                             PGC_BACKEND,
                             0,
#if (PG_VERSION_NUM >= 90100)
                             NULL,
#endif
                             NULL,
                             NULL);
    
    DefineCustomIntVariable("query_recorder.size_limit",
                            "File size limit (will create multiple files .000 - .999)",
                             NULL,
                             &max_file_size,
                             1024*1024*1024/BLCKSZ, /* 1GB */
                             1024*1024/BLCKSZ, 1024*1024*1024/BLCKSZ, /* 1MB - 1GB */
                             PGC_BACKEND,
                             GUC_UNIT_BLOCKS,
#if (PG_VERSION_NUM >= 90100)
                             NULL,
#endif
                             NULL,
                             NULL);
    
    DefineCustomIntVariable("query_recorder.buffer_size",
                            "Size of the buffer used to collect queries.",
                             NULL,
                             &buffer_size,
                             1024*1024/BLCKSZ, /* 1MB */
                             1, 16*1024*1024/BLCKSZ, /* 1 block - 16MB */
                             PGC_BACKEND,
                             GUC_UNIT_BLOCKS,
#if (PG_VERSION_NUM >= 90100)
                             NULL,
#endif
                             NULL,
                             NULL);
    
    /* Define custom GUC variables. */
    DefineCustomBoolVariable("query_recorder.normalize",
                             "Replace line breaks and carriage returns with spaces.",
                             NULL,
                             &normalize,
                             false,
                             PGC_BACKEND,
                             0,
#if (PG_VERSION_NUM >= 90100)
                             NULL,
#endif
                             &set_enabled,
                             NULL);
    
    /* Define custom GUC variables. */
    DefineCustomBoolVariable("query_recorder.enabled",
                             "Enable or disable recording of queries.",
                             NULL,
                             &enabled,
                             false,
                             PGC_SUSET,
                             0,
#if (PG_VERSION_NUM >= 90100)
                             NULL,
#endif
                             &set_enabled,
                             (GucShowHook)(&show_enabled));

    EmitWarningsOnPlaceholders("query_recorder");
    
    /*
     * Request additional shared resources.  (These are no-ops if we're not in
     * the postmaster process.)  We'll allocate or attach to the shared
     * resources in pg_record_shmem_startup().
     */
    RequestAddinShmemSpace(SEGMENT_SIZE);
    RequestAddinLWLocks(1);

    /* Install hooks. */
    prev_shmem_startup_hook = shmem_startup_hook;
    shmem_startup_hook = pg_record_shmem_startup;
    
    prev_ExecutorStart = ExecutorStart_hook;
    ExecutorStart_hook = explain_ExecutorStart;
    prev_ExecutorRun = ExecutorRun_hook;
    ExecutorRun_hook = explain_ExecutorRun;
#if (PG_VERSION_NUM >= 90100)
    prev_ExecutorFinish = ExecutorFinish_hook;
    ExecutorFinish_hook = explain_ExecutorFinish;
#endif
    prev_ExecutorEnd = ExecutorEnd_hook;
    ExecutorEnd_hook = explain_ExecutorEnd;
    prev_ProcessUtility = ProcessUtility_hook;
    ProcessUtility_hook = pg_record_ProcessUtility;
    
}
Esempio n. 16
0
static void registerGUCOptions(void)
{
	char pathbuf[MAXPGPATH];

	DefineCustomStringVariable(
		"pljava.libjvm_location",
		"Path to the libjvm (.so, .dll, etc.) file in Java's jre/lib area",
		NULL, /* extended description */
		&libjvmlocation,
		#if PG_VERSION_NUM >= 80400
			"libjvm",
		#endif
		PGC_SUSET,
		#if PG_VERSION_NUM >= 80400
			0,    /* flags */
		#endif
		#if PG_VERSION_NUM >= 90100
			check_libjvm_location,
		#endif
		assign_libjvm_location,
		NULL); /* show hook */

	DefineCustomStringVariable(
		"pljava.vmoptions",
		"Options sent to the JVM when it is created",
		NULL, /* extended description */
		&vmoptions,
		#if PG_VERSION_NUM >= 80400
			NULL, /* boot value */
		#endif
		PGC_SUSET,
		#if PG_VERSION_NUM >= 80400
			0,    /* flags */
		#endif
		#if PG_VERSION_NUM >= 90100
			check_vmoptions,
		#endif
		assign_vmoptions,
		NULL); /* show hook */

	DefineCustomStringVariable(
		"pljava.classpath",
		"Classpath used by the JVM",
		NULL, /* extended description */
		&classpath,
		#if PG_VERSION_NUM >= 80400
			InstallHelper_defaultClassPath(pathbuf), /* boot value */
		#endif
		PGC_SUSET,
		#if PG_VERSION_NUM >= 80400
			0,    /* flags */
		#endif
		#if PG_VERSION_NUM >= 90100
			check_classpath,
		#endif
		assign_classpath,
		NULL); /* show hook */

	DefineCustomBoolVariable(
		"pljava.debug",
		"Stop the backend to attach a debugger",
		NULL, /* extended description */
		&pljavaDebug,
		#if PG_VERSION_NUM >= 80400
			false, /* boot value */
		#endif
		PGC_USERSET,
		#if PG_VERSION_NUM >= 80400
			0,    /* flags */
		#endif
		#if PG_VERSION_NUM >= 90100
			NULL, /* check hook */
		#endif
		NULL, NULL); /* assign hook, show hook */

	DefineCustomIntVariable(
		"pljava.statement_cache_size",
		"Size of the prepared statement MRU cache",
		NULL, /* extended description */
		&statementCacheSize,
		#if PG_VERSION_NUM >= 80400
			11,   /* boot value */
		#endif
		0, 512,   /* min, max values */
		PGC_USERSET,
		#if PG_VERSION_NUM >= 80400
			0,    /* flags */
		#endif
		#if PG_VERSION_NUM >= 90100
			NULL, /* check hook */
		#endif
		NULL, NULL); /* assign hook, show hook */

	DefineCustomBoolVariable(
		"pljava.release_lingering_savepoints",
		"If true, lingering savepoints will be released on function exit. "
		"If false, they will be rolled back",
		NULL, /* extended description */
		&pljavaReleaseLingeringSavepoints,
		#if PG_VERSION_NUM >= 80400
			false, /* boot value */
		#endif
		PGC_USERSET,
		#if PG_VERSION_NUM >= 80400
			0,    /* flags */
		#endif
		#if PG_VERSION_NUM >= 90100
			NULL, /* check hook */
		#endif
		NULL, NULL); /* assign hook, show hook */

	DefineCustomBoolVariable(
		"pljava.enable",
		"If off, the Java virtual machine will not be started until set on.",
		"This is mostly of use on PostgreSQL versions < 9.2, where option "
		"settings changed before LOADing PL/Java may be rejected, so they must "
		"be made after LOAD, but before the virtual machine is started.",
		&pljavaEnabled,
		#if PG_VERSION_NUM >= 90200
			true,  /* boot value */
		#elif PG_VERSION_NUM >= 80400
			false, /* boot value */
		#endif
		PGC_USERSET,
		#if PG_VERSION_NUM >= 80400
			0,    /* flags */
		#endif
		#if PG_VERSION_NUM >= 90100
			check_enabled, /* check hook */
		#endif
		assign_enabled,
		NULL); /* show hook */

	DefineCustomStringVariable(
		"pljava.implementors",
		"Implementor names recognized in deployment descriptors",
		NULL, /* extended description */
		&implementors,
		#if PG_VERSION_NUM >= 80400
			"postgresql", /* boot value */
		#endif
		PGC_USERSET,
		#if PG_VERSION_NUM >= 80400
			GUC_LIST_INPUT | GUC_LIST_QUOTE,
		#endif
		#if PG_VERSION_NUM >= 90100
			NULL, /* check hook */
		#endif
		NULL, NULL); /* assign hook, show hook */

	EmitWarningsOnPlaceholders("pljava");
}
Esempio n. 17
0
/*
 * Module load callback
 */
void
_PG_init(void)
{
	if (pgscws_scws)
		return;

	pgscws_init();

	DefineCustomBoolVariable("scws.dict_in_memory",
							 "load dicts into memory",
							 NULL,
							 &pgscws_dict_in_memory,
							 false,
							 PGC_BACKEND,
							 0,
							 NULL,
							 pgscws_assign_dict_in_memory,
							 NULL);
	DefineCustomStringVariable("scws.charset",
							   "charset",
							   NULL,
							   &pgscws_charset,
							   "utf8",
							   PGC_USERSET,
							   0,
							   pgscws_check_charset,
							   pgscws_assign_charset,
							   NULL);
	DefineCustomStringVariable("scws.rules",
							   "rules to load",
							   NULL,
							   &pgscws_rules,
							   "rules.utf8.ini",
							   PGC_USERSET,
							   0,
							   pgscws_check_rules,
							   pgscws_assign_rules,
							   NULL);
	DefineCustomStringVariable("scws.extra_dicts",
							   "extra dicts files to load",
							   NULL,
							   &pgscws_extra_dicts,
							   "dict.utf8.xdb",
							   PGC_USERSET,
							   0,
							   pgscws_check_extra_dicts,
							   pgscws_assign_extra_dicts,
							   NULL);

	DefineCustomBoolVariable("scws.punctuation_ignore",
							 "set if scws ignores the puncuation",
							 "set if scws ignores the puncuation, except \\r and \\n",
							 &pgscws_punctuation_ignore,
							 false,
							 PGC_USERSET,
							 0,
							 NULL,
							 NULL,
							 NULL);
	DefineCustomBoolVariable("scws.seg_with_duality",
							 "segment words with duality",
							 NULL,
							 &pgscws_seg_with_duality,
							 false,
							 PGC_USERSET,
							 0,
							 NULL,
							 NULL,
							 NULL);
	DefineCustomStringVariable("scws.multi_mode",
							   "set multi mode",
							   "\"none\" for none\n"
							   "\"short\" for prefer short words\n"
							   "\"duality\" for prefer duality\n"
							   "\"zmain\" prefer most important element"
							   "\"zall\" prefer prefer all element",
							   &pgscws_multi_mode_string,
							   "none",
							   PGC_USERSET,
							   0,
							   pgscws_check_multi_mode,
							   pgscws_assign_multi_mode,
							   NULL);
}
Esempio n. 18
0
/*
 * _PG_init()           - library load-time initialization
 *
 * DO NOT make this static nor change its name!
 *
 * Init the module, all we have to do here is getting our GUC
 */
void
_PG_init(void)
{
    char        sharepath[MAXPGPATH];
    char       *default_control_directory;

    get_share_path(my_exec_path, sharepath);
    default_control_directory = (char *) palloc(MAXPGPATH);
    snprintf(default_control_directory, MAXPGPATH, "%s/extension", sharepath);

    DefineCustomStringVariable("pginstall.archive_dir",
                               "Path where to download extension archives.",
                               "",
                               &pginstall_archive_dir,
                               "",
                               PGC_SUSET,
                               GUC_NOT_IN_SAMPLE,
                               NULL,
                               NULL,
                               NULL);

    DefineCustomStringVariable("pginstall.control_dir",
                               "Path where to install extension control files.",
                               "",
                               &pginstall_control_dir,
                               default_control_directory,
                               PGC_SUSET,
                               GUC_NOT_IN_SAMPLE,
                               NULL,
                               NULL,
                               NULL);

    DefineCustomStringVariable("pginstall.extension_dir",
                               "Path where to install extension contents.",
                               "",
                               &pginstall_extension_dir,
                               "",
                               PGC_SUSET,
                               GUC_NOT_IN_SAMPLE,
                               NULL,
                               NULL,
                               NULL);

    DefineCustomStringVariable("pginstall.repository",
                               "Extension Repository URL",
                               "",
                               &pginstall_repository,
                               "",
                               PGC_SUSET,
                               GUC_NOT_IN_SAMPLE,
                               NULL,
                               NULL,
                               NULL);

    DefineCustomStringVariable("pginstall.custom_path",
                               "Directory where to load custom scripts from",
                               "",
                               &pginstall_custom_path,
                               "",
                               PGC_SUSET,
                               GUC_NOT_IN_SAMPLE,
                               NULL,
                               NULL,
                               NULL);

    DefineCustomStringVariable("pginstall.whitelist",
                               "List of extensions that are whitelisted",
                               "Separated by comma",
                               &pginstall_whitelist,
                               "",
                               PGC_SUSET,
                               GUC_NOT_IN_SAMPLE,
                               NULL,
                               NULL,
                               NULL);

    DefineCustomBoolVariable("pginstall.sudo",
                             "Allow privilege escalation to install extensions",
                             "",
                             &pginstall_sudo,
                             false,
                             PGC_SUSET,
                             GUC_NOT_IN_SAMPLE,
                             NULL,
                             NULL,
                             NULL);

    DefineCustomBoolVariable("pginstall.serve_from_archive_dir",
                             "Avoid contacting the repository server when the needed archive file is already available locally",
                             "",
                             &pginstall_serve_from_archive_dir,
                             false,
                             PGC_SUSET,
                             GUC_NOT_IN_SAMPLE,
                             NULL,
                             NULL,
                             NULL);

    prev_ProcessUtility = ProcessUtility_hook;
    ProcessUtility_hook = pginstall_ProcessUtility;
}
Esempio n. 19
0
/* Module load callback */
void
_PG_init(void) {

	char *env_postgis_gdal_enabled_drivers = NULL;
	char *boot_postgis_gdal_enabled_drivers = NULL;

	char *env_postgis_enable_outdb_rasters = NULL;
	bool boot_postgis_enable_outdb_rasters = false;

	/*
	 use POSTGIS_GDAL_ENABLED_DRIVERS to set the bootValue
	 of GUC postgis.gdal_enabled_drivers
	*/
	env_postgis_gdal_enabled_drivers = getenv("POSTGIS_GDAL_ENABLED_DRIVERS");
	if (env_postgis_gdal_enabled_drivers == NULL) {
		boot_postgis_gdal_enabled_drivers = palloc(
			sizeof(char) * (strlen(GDAL_DISABLE_ALL) + 1)
		);
		sprintf(boot_postgis_gdal_enabled_drivers, "%s", GDAL_DISABLE_ALL);
	}
	else {
		boot_postgis_gdal_enabled_drivers = rtpg_trim(
			env_postgis_gdal_enabled_drivers
		);
	}
	POSTGIS_RT_DEBUGF(
		4,
		"boot_postgis_gdal_enabled_drivers = %s",
		boot_postgis_gdal_enabled_drivers
	);

	/*
	 use POSTGIS_ENABLE_OUTDB_RASTERS to set the bootValue
	 of GUC postgis.enable_outdb_rasters
	*/
	env_postgis_enable_outdb_rasters = getenv("POSTGIS_ENABLE_OUTDB_RASTERS");
	if (env_postgis_enable_outdb_rasters != NULL) {
		char *env = rtpg_trim(env_postgis_enable_outdb_rasters);

		/* out of memory */
		if (env == NULL) {
			elog(ERROR, "_PG_init: Cannot process environmental variable: POSTGIS_ENABLE_OUTDB_RASTERS");
			return;
		}

		if (strcmp(env, "1") == 0)
			boot_postgis_enable_outdb_rasters = true;

		pfree(env);
	}
	POSTGIS_RT_DEBUGF(
		4,
		"boot_postgis_enable_outdb_rasters = %s",
		boot_postgis_enable_outdb_rasters ? "TRUE" : "FALSE"
	);

	/* Install liblwgeom handlers */
	pg_install_lwgeom_handlers();

	/* TODO: Install raster callbacks (see rt_init_allocators)??? */

	/* Define custom GUC variables. */

	DefineCustomStringVariable(
		"postgis.gdal_datapath", /* name */
		"Path to GDAL data files.", /* short_desc */
		"Physical path to directory containing GDAL data files (sets the GDAL_DATA config option).", /* long_desc */
		&gdal_datapath, /* valueAddr */
		NULL, /* bootValue */
		PGC_SUSET, /* GucContext context */
		0, /* int flags */
#if POSTGIS_PGSQL_VERSION >= 91
		NULL, /* GucStringCheckHook check_hook */
#endif
		rtpg_assignHookGDALDataPath, /* GucStringAssignHook assign_hook */
		NULL  /* GucShowHook show_hook */
	);

	DefineCustomStringVariable(
		"postgis.gdal_enabled_drivers", /* name */
		"Enabled GDAL drivers.", /* short_desc */
		"List of enabled GDAL drivers by short name. To enable/disable all drivers, use 'ENABLE_ALL' or 'DISABLE_ALL' (sets the GDAL_SKIP config option).", /* long_desc */
		&gdal_enabled_drivers, /* valueAddr */
		boot_postgis_gdal_enabled_drivers, /* bootValue */
		PGC_SUSET, /* GucContext context */
		0, /* int flags */
#if POSTGIS_PGSQL_VERSION >= 91
		NULL, /* GucStringCheckHook check_hook */
#endif
		rtpg_assignHookGDALEnabledDrivers, /* GucStringAssignHook assign_hook */
		NULL  /* GucShowHook show_hook */
	);

	DefineCustomBoolVariable(
		"postgis.enable_outdb_rasters", /* name */
		"Enable Out-DB raster bands", /* short_desc */
		"If true, rasters can access data located outside the database", /* long_desc */
		&enable_outdb_rasters, /* valueAddr */
		boot_postgis_enable_outdb_rasters, /* bootValue */
		PGC_SUSET, /* GucContext context */
		0, /* int flags */
#if POSTGIS_PGSQL_VERSION >= 91
		NULL, /* GucStringCheckHook check_hook */
#endif
		rtpg_assignHookEnableOutDBRasters, /* GucBoolAssignHook assign_hook */
		NULL  /* GucShowHook show_hook */
	);

	/* free memory allocations */
	pfree(boot_postgis_gdal_enabled_drivers);
}
Esempio n. 20
0
/*
 * Module load callback
 */
void
_PG_init(void)
{
	/* Define custom GUC variables. */
	DefineCustomIntVariable("auto_explain.log_min_duration",
		 "Sets the minimum execution time above which plans will be logged.",
						 "Zero prints all plans. -1 turns this feature off.",
							&auto_explain_log_min_duration,
							-1,
							-1, INT_MAX / 1000,
							PGC_SUSET,
							GUC_UNIT_MS,
							NULL,
							NULL,
							NULL);

	DefineCustomBoolVariable("auto_explain.log_analyze",
							 "Use EXPLAIN ANALYZE for plan logging.",
							 NULL,
							 &auto_explain_log_analyze,
							 false,
							 PGC_SUSET,
							 0,
							 NULL,
							 NULL,
							 NULL);

	DefineCustomBoolVariable("auto_explain.log_verbose",
							 "Use EXPLAIN VERBOSE for plan logging.",
							 NULL,
							 &auto_explain_log_verbose,
							 false,
							 PGC_SUSET,
							 0,
							 NULL,
							 NULL,
							 NULL);

	DefineCustomBoolVariable("auto_explain.log_buffers",
							 "Log buffers usage.",
							 NULL,
							 &auto_explain_log_buffers,
							 false,
							 PGC_SUSET,
							 0,
							 NULL,
							 NULL,
							 NULL);

	DefineCustomEnumVariable("auto_explain.log_format",
							 "EXPLAIN format to be used for plan logging.",
							 NULL,
							 &auto_explain_log_format,
							 EXPLAIN_FORMAT_TEXT,
							 format_options,
							 PGC_SUSET,
							 0,
							 NULL,
							 NULL,
							 NULL);

	DefineCustomBoolVariable("auto_explain.log_nested_statements",
							 "Log nested statements.",
							 NULL,
							 &auto_explain_log_nested_statements,
							 false,
							 PGC_SUSET,
							 0,
							 NULL,
							 NULL,
							 NULL);

	EmitWarningsOnPlaceholders("auto_explain");

	/* Install hooks. */
	prev_ExecutorStart = ExecutorStart_hook;
	ExecutorStart_hook = explain_ExecutorStart;
	prev_ExecutorRun = ExecutorRun_hook;
	ExecutorRun_hook = explain_ExecutorRun;
	prev_ExecutorFinish = ExecutorFinish_hook;
	ExecutorFinish_hook = explain_ExecutorFinish;
	prev_ExecutorEnd = ExecutorEnd_hook;
	ExecutorEnd_hook = explain_ExecutorEnd;
}
Esempio n. 21
0
/*
 * _PG_init
 * Entry point loading hooks
 */
void
_PG_init(void)
{
	/* Set up GUCs */
	DefineCustomStringVariable("redislog.host",
	  "Redis server host name or IP address.",
	  NULL,
	  &Redislog_host,
	  "127.0.0.1",
	  PGC_SIGHUP,
	  GUC_NOT_IN_SAMPLE | GUC_SUPERUSER_ONLY,
	  NULL,
	  &guc_on_assign_reopen_string,
	  NULL);

	DefineCustomIntVariable("redislog.port",
	  "Redis server port number.",
	  NULL,
	  &Redislog_port,
	  6379,
	  0,
	  65535,
	  PGC_SIGHUP,
	  GUC_NOT_IN_SAMPLE | GUC_SUPERUSER_ONLY,
	  NULL,
	  &guc_on_assign_reopen_int,
	  NULL);

	DefineCustomIntVariable("redislog.connection_timeout",
	  "Redis server connection timeout.",
	  NULL,
	  &Redislog_timeout,
	  1000,
	  1,
	  INT_MAX,
	  PGC_SIGHUP,
	  GUC_NOT_IN_SAMPLE | GUC_SUPERUSER_ONLY | GUC_UNIT_MS,
	  NULL,
	  NULL,
	  NULL);

	DefineCustomStringVariable("redislog.key",
	  "Redis server key name.",
	  NULL,
	  &Redislog_key,
	  "postgres",
	  PGC_SIGHUP,
	  GUC_NOT_IN_SAMPLE | GUC_SUPERUSER_ONLY,
	  NULL,
	  NULL,
	  NULL);

	DefineCustomEnumVariable("redislog.min_error_statement",
	  "Controls which SQL statements that cause an error condition are "
	  "recorded in the server log.",
	  "Each level includes all the levels that follow it. The later "
	  "the level, the fewer messages are sent.",
	  &Redislog_min_error_statement,
	  log_min_error_statement,
	  server_message_level_options,
	  PGC_SUSET,
	  GUC_NOT_IN_SAMPLE,
	  NULL,
	  NULL,
	  NULL);

	DefineCustomEnumVariable("redislog.min_messages",
	  "Set the message levels that are logged.",
	  "Each level includes all the levels that follow it. The higher "
	  "the level, the fewer messages are sent.",
	  &Redislog_min_messages,
	  WARNING,
	  server_message_level_options,
	  PGC_SUSET,
	  GUC_NOT_IN_SAMPLE,
	  NULL,
	  NULL,
	  NULL);

	DefineCustomBoolVariable("redislog.ship_to_redis_only",
	  "Send log messages to Redis only.",
	  "If set to true, send log messages to Redis only and skip "
	  "journaling them into the main PostgreSQL log. Use the "
	  "PostgreSQL main logger facility for fallback purposes only, "
	  "in case no Redis service is available. "
	  "By default it is set to false.",
	  &Redislog_ship_to_redis_only,
	  FALSE,
	  PGC_SUSET,
	  GUC_NOT_IN_SAMPLE,
	  NULL,
	  NULL,
	  NULL);

	prev_log_hook = emit_log_hook;
	emit_log_hook = redis_log_hook;

	EmitWarningsOnPlaceholders("redislog");
}
Esempio n. 22
0
File: main.c Progetto: ablimit/devel
static void
pgstrom_init_misc_guc(void)
{
	/* GUC variables according to the device information */
	DefineCustomBoolVariable("pg_strom.enabled",
							 "Enables the planner's use of PG-Strom",
							 NULL,
							 &pgstrom_enabled,
							 true,
							 PGC_USERSET,
							 GUC_NOT_IN_SAMPLE,
							 NULL, NULL, NULL);
	DefineCustomBoolVariable("pg_strom.perfmon",
							 "Enables the performance monitor of PG-Strom",
							 NULL,
							 &pgstrom_perfmon_enabled,
							 false,
							 PGC_USERSET,
							 GUC_NOT_IN_SAMPLE,
							 NULL, NULL, NULL);
	DefineCustomBoolVariable("pg_strom.show_device_kernel",
							 "Enables to show device kernel on EXPLAIN",
							 NULL,
							 &pgstrom_show_device_kernel,
							 false,
							 PGC_USERSET,
							 GUC_NOT_IN_SAMPLE,
							 NULL, NULL, NULL);
	DefineCustomIntVariable("pg_strom.chunk_size",
							"default size of pgstrom_data_store in MB",
							NULL,
							&pgstrom_chunk_size,
							15,
							4,
							128,
							PGC_USERSET,
							GUC_NOT_IN_SAMPLE,
							NULL, NULL, NULL);
	DefineCustomIntVariable("pg_strom.min_async_chunks",
							"least number of chunks to be run asynchronously",
							NULL,
							&pgstrom_min_async_chunks,
							2,
							2,
							INT_MAX,
							PGC_USERSET,
							GUC_NOT_IN_SAMPLE,
							NULL, NULL, NULL);
	DefineCustomIntVariable("pg_strom.max_async_chunks",
							"max number of chunk to be run asynchronously",
							NULL,
							&pgstrom_max_async_chunks,
							3,
							pgstrom_min_async_chunks + 1,
							INT_MAX,
							PGC_USERSET,
							GUC_NOT_IN_SAMPLE,
							NULL, NULL, NULL);
	if (pgstrom_max_async_chunks <= pgstrom_min_async_chunks)
		ereport(ERROR,
				(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
				 errmsg("\"pg_strom.max_async_chunks\" must be larger than \"pg_strom.min_async_chunks\"")));

	DefineCustomRealVariable("gpu_setup_cost",
							 "Cost to setup GPU device to run",
							 NULL,
							 &pgstrom_gpu_setup_cost,
							 500 * DEFAULT_SEQ_PAGE_COST,
							 0,
							 DBL_MAX,
							 PGC_USERSET,
							 GUC_NOT_IN_SAMPLE,
							 NULL, NULL, NULL);

	DefineCustomRealVariable("gpu_operator_cost",
							 "Cost of processing each operators by GPU",
							 NULL,
							 &pgstrom_gpu_operator_cost,
							 DEFAULT_CPU_OPERATOR_COST / 100.0,
							 0,
							 DBL_MAX,
							 PGC_USERSET,
							 GUC_NOT_IN_SAMPLE,
							 NULL, NULL, NULL);

	DefineCustomRealVariable("gpu_tuple_cost",
							 "Cost of processing each tuple for GPU",
							 NULL,
							 &pgstrom_gpu_tuple_cost,
							 DEFAULT_CPU_TUPLE_COST / 32,
							 0,
							 DBL_MAX,
                             PGC_USERSET,
                             GUC_NOT_IN_SAMPLE,
                             NULL, NULL, NULL);
}
Esempio n. 23
0
/*
 * Module load callback
 *
 * Holds GUC variables that cause some behavior changes in similarity functions
 *
 */
void
_PG_init(void)
{
	static const struct config_enum_entry pgs_tokenizer_options[] = {
		{"alnum", PGS_UNIT_ALNUM, false},
		{"gram", PGS_UNIT_GRAM, false},
		{"word", PGS_UNIT_WORD, false},
		{"camelcase", PGS_UNIT_CAMELCASE, false},
		{NULL, 0, false}
	};
	static const struct config_enum_entry pgs_gram_options[] = {
		{"gram", PGS_UNIT_GRAM, false},
		{NULL, 0, false}
	};

	/* Block */
	DefineCustomEnumVariable("pg_similarity.block_tokenizer",
			"Sets the tokenizer for Block similarity function.",
			"Valid values are \"alnum\", \"gram\", \"word\", or \"camelcase\".",
			&pgs_block_tokenizer,
			PGS_UNIT_ALNUM,
			pgs_tokenizer_options,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);
	DefineCustomRealVariable("pg_similarity.block_threshold",
			"Sets the threshold used by the Block similarity function.",
			"Valid range is 0.0 .. 1.0.",
			&pgs_block_threshold,
			0.7,
			0.0,
			1.0,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);
	DefineCustomBoolVariable("pg_similarity.block_is_normalized",
			"Sets if the result value is normalized or not.",
			NULL,
			&pgs_block_is_normalized,
			true,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);

	/* Cosine */
	DefineCustomEnumVariable("pg_similarity.cosine_tokenizer",
			"Sets the tokenizer for Cosine similarity function.",
			"Valid values are \"alnum\", \"gram\", \"word\", or \"camelcase\".",
			&pgs_cosine_tokenizer,
			PGS_UNIT_ALNUM,
			pgs_tokenizer_options,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);
	DefineCustomRealVariable("pg_similarity.cosine_threshold",
			"Sets the threshold used by the Cosine similarity function.",
			"Valid range is 0.0 .. 1.0.",
			&pgs_cosine_threshold,
			0.7,
			0.0,
			1.0,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);
	DefineCustomBoolVariable("pg_similarity.cosine_is_normalized",
			"Sets if the result value is normalized or not.",
			NULL,
			&pgs_cosine_is_normalized,
			true,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);

	/* Dice */
	DefineCustomEnumVariable("pg_similarity.dice_tokenizer",
			"Sets the tokenizer for Dice similarity measure.",
			"Valid values are \"alnum\", \"gram\", \"word\", or \"camelcase\".",
			&pgs_dice_tokenizer,
			PGS_UNIT_ALNUM,
			pgs_tokenizer_options,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);
	DefineCustomRealVariable("pg_similarity.dice_threshold",
			"Sets the threshold used by the Dice similarity measure.",
			"Valid range is 0.0 .. 1.0.",
			&pgs_dice_threshold,
			0.7,
			0.0,
			1.0,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);
	DefineCustomBoolVariable("pg_similarity.dice_is_normalized",
			"Sets if the result value is normalized or not.",
			NULL,
			&pgs_dice_is_normalized,
			true,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);

	/* Euclidean */
	DefineCustomEnumVariable("pg_similarity.euclidean_tokenizer",
			"Sets the tokenizer for Euclidean similarity measure.",
			"Valid values are \"alnum\", \"gram\", \"word\", or \"camelcase\".",
			&pgs_euclidean_tokenizer,
			PGS_UNIT_ALNUM,
			pgs_tokenizer_options,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);
	DefineCustomRealVariable("pg_similarity.euclidean_threshold",
			"Sets the threshold used by the Euclidean similarity measure.",
			"Valid range is 0.0 .. 1.0.",
			&pgs_euclidean_threshold,
			0.7,
			0.0,
			1.0,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);
	DefineCustomBoolVariable("pg_similarity.euclidean_is_normalized",
			"Sets if the result value is normalized or not.",
			NULL,
			&pgs_euclidean_is_normalized,
			true,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);

	/* Hamming */
	DefineCustomRealVariable("pg_similarity.hamming_threshold",
			"Sets the threshold used by the Block similarity metric.",
			"Valid range is 0.0 .. 1.0.",
			&pgs_hamming_threshold,
			0.7,
			0.0,
			1.0,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);
	DefineCustomBoolVariable("pg_similarity.hamming_is_normalized",
			"Sets if the result value is normalized or not.",
			NULL,
			&pgs_hamming_is_normalized,
			true,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);

	/* Jaccard */
	DefineCustomEnumVariable("pg_similarity.jaccard_tokenizer",
			"Sets the tokenizer for Jaccard similarity measure.",
			"Valid values are \"alnum\", \"gram\", \"word\", or \"camelcase\".",
			&pgs_jaccard_tokenizer,
			PGS_UNIT_ALNUM,
			pgs_tokenizer_options,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);
	DefineCustomRealVariable("pg_similarity.jaccard_threshold",
			"Sets the threshold used by the Jaccard similarity measure.",
			"Valid range is 0.0 .. 1.0.",
			&pgs_jaccard_threshold,
			0.7,
			0.0,
			1.0,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);
	DefineCustomBoolVariable("pg_similarity.jaccard_is_normalized",
			"Sets if the result value is normalized or not.",
			NULL,
			&pgs_jaccard_is_normalized,
			true,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);

	/* Jaro */
	DefineCustomRealVariable("pg_similarity.jaro_threshold",
			"Sets the threshold used by the Jaro similarity measure.",
			"Valid range is 0.0 .. 1.0.",
			&pgs_jaro_threshold,
			0.7,
			0.0,
			1.0,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);
	DefineCustomBoolVariable("pg_similarity.jaro_is_normalized",
			"Sets if the result value is normalized or not.",
			NULL,
			&pgs_jaro_is_normalized,
			true,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);

	/* Jaro-Winkler */
	DefineCustomRealVariable("pg_similarity.jarowinkler_threshold",
			"Sets the threshold used by the Jaro similarity measure.",
			"Valid range is 0.0 .. 1.0.",
			&pgs_jarowinkler_threshold,
			0.7,
			0.0,
			1.0,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);
	DefineCustomBoolVariable("pg_similarity.jarowinkler_is_normalized",
			"Sets if the result value is normalized or not.",
			NULL,
			&pgs_jarowinkler_is_normalized,
			true,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);

	/* Levenshtein */
	DefineCustomRealVariable("pg_similarity.levenshtein_threshold",
			"Sets the threshold used by the Levenshtein similarity measure.",
			"Valid range is 0.0 .. 1.0.",
			&pgs_levenshtein_threshold,
			0.7,
			0.0,
			1.0,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);
	DefineCustomBoolVariable("pg_similarity.levenshtein_is_normalized",
			"Sets if the result value is normalized or not.",
			NULL,
			&pgs_levenshtein_is_normalized,
			true,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);

	/* Matching Coefficient */
	DefineCustomEnumVariable("pg_similarity.matching_tokenizer",
			"Sets the tokenizer for Matching Coefficient similarity measure.",
			"Valid values are \"alnum\", \"gram\", \"word\", or \"camelcase\".",
			&pgs_matching_tokenizer,
			PGS_UNIT_ALNUM,
			pgs_tokenizer_options,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);
	DefineCustomRealVariable("pg_similarity.matching_threshold",
			"Sets the threshold used by the Matching Coefficient similarity measure.",
			"Valid range is 0.0 .. 1.0.",
			&pgs_matching_threshold,
			0.7,
			0.0,
			1.0,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);
	DefineCustomBoolVariable("pg_similarity.matching_is_normalized",
			"Sets if the result value is normalized or not.",
			NULL,
			&pgs_matching_is_normalized,
			true,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);

	/* Monge-Elkan */
	DefineCustomEnumVariable("pg_similarity.mongeelkan_tokenizer",
			"Sets the tokenizer for Monge-Elkan similarity measure.",
			"Valid values are \"alnum\", \"gram\", \"word\", or \"camelcase\".",
			&pgs_mongeelkan_tokenizer,
			PGS_UNIT_ALNUM,
			pgs_tokenizer_options,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);
	DefineCustomRealVariable("pg_similarity.mongeelkan_threshold",
			"Sets the threshold used by the Monge-Elkan similarity measure.",
			"Valid range is 0.0 .. 1.0.",
			&pgs_mongeelkan_threshold,
			0.7,
			0.0,
			1.0,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);
	DefineCustomBoolVariable("pg_similarity.mongeelkan_is_normalized",
			"Sets if the result value is normalized or not.",
			NULL,
			&pgs_mongeelkan_is_normalized,
			true,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);

	/* Needleman-Wunsch */
	DefineCustomRealVariable("pg_similarity.nw_threshold",
			"Sets the threshold used by the Needleman-Wunsch similarity measure.",
			"Valid range is 0.0 .. 1.0.",
			&pgs_nw_threshold,
			0.7,
			0.0,
			1.0,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);
	DefineCustomBoolVariable("pg_similarity.nw_is_normalized",
			"Sets if the result value is normalized or not.",
			NULL,
			&pgs_nw_is_normalized,
			true,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);
	DefineCustomRealVariable("pg_similarity.nw_gap_penalty",
			"Sets the gap penalty used by the Needleman-Wunsch similarity measure.",
			NULL,
			&pgs_nw_gap_penalty,
			-5.0,
			LONG_MIN,
			LONG_MAX,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);

	/* Overlap Coefficient */
	DefineCustomEnumVariable("pg_similarity.overlap_tokenizer",
			"Sets the tokenizer for Overlap Coefficient similarity measure.",
			"Valid values are \"alnum\", \"gram\", \"word\", or \"camelcase\".",
			&pgs_overlap_tokenizer,
			PGS_UNIT_ALNUM,
			pgs_tokenizer_options,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);
	DefineCustomRealVariable("pg_similarity.overlap_threshold",
			"Sets the threshold used by the Overlap Coefficient similarity measure.",
			"Valid range is 0.0 .. 1.0.",
			&pgs_overlap_threshold,
			0.7,
			0.0,
			1.0,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);
	DefineCustomBoolVariable("pg_similarity.overlap_is_normalized",
			"Sets if the result value is normalized or not.",
			NULL,
			&pgs_overlap_is_normalized,
			true,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);

	/* Q-Gram */
	DefineCustomEnumVariable("pg_similarity.qgram_tokenizer",
			"Sets the tokenizer for Q-Gram similarity function.",
			"Valid value is \"gram\".",
			&pgs_qgram_tokenizer,
			PGS_UNIT_GRAM,
			pgs_gram_options,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);
	DefineCustomRealVariable("pg_similarity.qgram_threshold",
			"Sets the threshold used by the Q-Gram similarity function.",
			"Valid range is 0.0 .. 1.0.",
			&pgs_qgram_threshold,
			0.7,
			0.0,
			1.0,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);
	DefineCustomBoolVariable("pg_similarity.qgram_is_normalized",
			"Sets if the result value is normalized or not.",
			NULL,
			&pgs_qgram_is_normalized,
			true,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);

	/* Smith-Waterman */
	DefineCustomRealVariable("pg_similarity.sw_threshold",
			"Sets the threshold used by the Smith-Waterman similarity measure.",
			"Valid range is 0.0 .. 1.0.",
			&pgs_sw_threshold,
			0.7,
			0.0,
			1.0,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);
	DefineCustomBoolVariable("pg_similarity.sw_is_normalized",
			"Sets if the result value is normalized or not.",
			NULL,
			&pgs_sw_is_normalized,
			true,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);

	/* Smith-Waterman-Gotoh */
	DefineCustomRealVariable("pg_similarity.swg_threshold",
			"Sets the threshold used by the Smith-Waterman-Gotoh similarity measure.",
			"Valid range is 0.0 .. 1.0.",
			&pgs_swg_threshold,
			0.7,
			0.0,
			1.0,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);
	DefineCustomBoolVariable("pg_similarity.swg_is_normalized",
			"Sets if the result value is normalized or not.",
			NULL,
			&pgs_swg_is_normalized,
			true,
			PGC_USERSET,
			0,
#if	PG_VERSION_NUM >= 90100
			NULL,
#endif
			NULL,
			NULL);
}
Esempio n. 24
0
/*
 * Module load callback
 */
void
_PG_init(void)
{
    
    /* */
    if (!process_shared_preload_libraries_in_progress)
        return;
    
    /* Define custom GUC variables. */
    DefineCustomBoolVariable("query_histogram.dynamic",
                              "Dynamic histogram may be modified on the fly.",
                             NULL,
                             &default_histogram_dynamic,
                             false,
                             PGC_BACKEND,
                             0,
#if (PG_VERSION_NUM >= 90100)
                             NULL,
#endif
                             NULL,
                             NULL);
    
    /* Define custom GUC variables. */
    DefineCustomBoolVariable("query_histogram.track_utility",
                              "Selects whether utility commands are tracked.",
                             NULL,
                             &default_histogram_utility,
                             true,
                             PGC_SUSET,
                             0,
#if (PG_VERSION_NUM >= 90100)
                             NULL,
#endif
                             &set_histogram_track_utility,
                             NULL);
    
    DefineCustomIntVariable("query_histogram.bin_count",
                         "Sets the number of bins of the histogram.",
                         "Zero disables collecting the histogram.",
                            &default_histogram_bins,
                            100,
                            0, 1000,
                            PGC_SUSET,
                            0,
#if (PG_VERSION_NUM >= 90100)
                            NULL,
#endif
                            &set_histogram_bins_count_hook,
                            NULL);
    
    DefineCustomIntVariable("query_histogram.bin_width",
                         "Sets the width of the histogram bin.",
                            NULL,
                            &default_histogram_step,
                            100,
                            1, 1000,
                            PGC_SUSET,
                            GUC_UNIT_MS,
#if (PG_VERSION_NUM >= 90100)
                            NULL,
#endif
                            &set_histogram_bins_width_hook,
                            NULL);
    
    DefineCustomIntVariable("query_histogram.sample_pct",
                         "What portion of the queries should be sampled (in percent).",
                            NULL,
                            &default_histogram_sample_pct,
                            5,
                            1, 100,
                            PGC_SUSET,
                            0,
#if (PG_VERSION_NUM >= 90100)
                            NULL,
#endif
                            &set_histogram_sample_hook,
                            NULL);

    DefineCustomEnumVariable("query_histogram.histogram_type",
                             "Type of the histogram (how the bin width is computed).",
                             NULL,
                             &default_histogram_type,
                             HISTOGRAM_LINEAR,
                             histogram_type_options,
                             PGC_SUSET,
                             0,
#if (PG_VERSION_NUM >= 90100)
                             NULL,
#endif
                             &set_histogram_type_hook,
                             NULL);

    EmitWarningsOnPlaceholders("query_histogram");
    
    /*
     * Request additional shared resources.  (These are no-ops if we're not in
     * the postmaster process.)  We'll allocate or attach to the shared
     * resources in histogram_shmem_startup().
     */
    RequestAddinShmemSpace(get_histogram_size());
    RequestAddinLWLocks(1);

    /* Install hooks. */
    prev_shmem_startup_hook = shmem_startup_hook;
    shmem_startup_hook = histogram_shmem_startup;
    
    prev_ExecutorStart = ExecutorStart_hook;
    ExecutorStart_hook = explain_ExecutorStart;
    prev_ExecutorRun = ExecutorRun_hook;
    ExecutorRun_hook = explain_ExecutorRun;
#if (PG_VERSION_NUM >= 90100)
    prev_ExecutorFinish = ExecutorFinish_hook;
    ExecutorFinish_hook = explain_ExecutorFinish;
#endif
    prev_ExecutorEnd = ExecutorEnd_hook;
    ExecutorEnd_hook = explain_ExecutorEnd;
    prev_ProcessUtility = ProcessUtility_hook;
    ProcessUtility_hook = queryhist_ProcessUtility;

}
Esempio n. 25
0
/*
 * Module load callback
 */
void
_PG_init(void)
{
	/*
	 * In order to create our shared memory area, we have to be loaded via
	 * shared_preload_libraries.  If not, fall out without hooking into any of
	 * the main system.  (We don't throw error here because it seems useful to
	 * allow the pg_stat_statements functions to be created even when the
	 * module isn't active.  The functions must protect themselves against
	 * being called then, however.)
	 */
	if (!process_shared_preload_libraries_in_progress)
		return;

	/*
	 * Define (or redefine) custom GUC variables.
	 */
	DefineCustomIntVariable("pg_stat_statements.max",
	  "Sets the maximum number of statements tracked by pg_stat_statements.",
							NULL,
							&pgss_max,
							1000,
							100,
							INT_MAX,
							PGC_POSTMASTER,
							0,
							NULL,
							NULL);

	DefineCustomEnumVariable("pg_stat_statements.track",
			   "Selects which statements are tracked by pg_stat_statements.",
							 NULL,
							 &pgss_track,
							 PGSS_TRACK_TOP,
							 track_options,
							 PGC_SUSET,
							 0,
							 NULL,
							 NULL);

	DefineCustomBoolVariable("pg_stat_statements.track_utility",
	   "Selects whether utility commands are tracked by pg_stat_statements.",
							 NULL,
							 &pgss_track_utility,
							 true,
							 PGC_SUSET,
							 0,
							 NULL,
							 NULL);

	DefineCustomBoolVariable("pg_stat_statements.save",
			   "Save pg_stat_statements statistics across server shutdowns.",
							 NULL,
							 &pgss_save,
							 true,
							 PGC_SIGHUP,
							 0,
							 NULL,
							 NULL);

	EmitWarningsOnPlaceholders("pg_stat_statements");

	/*
	 * Request additional shared resources.  (These are no-ops if we're not in
	 * the postmaster process.)  We'll allocate or attach to the shared
	 * resources in pgss_shmem_startup().
	 */
	RequestAddinShmemSpace(pgss_memsize());
	RequestAddinLWLocks(1);

	/*
	 * Install hooks.
	 */
	prev_shmem_startup_hook = shmem_startup_hook;
	shmem_startup_hook = pgss_shmem_startup;
	prev_ExecutorStart = ExecutorStart_hook;
	ExecutorStart_hook = pgss_ExecutorStart;
	prev_ExecutorRun = ExecutorRun_hook;
	ExecutorRun_hook = pgss_ExecutorRun;
	prev_ExecutorEnd = ExecutorEnd_hook;
	ExecutorEnd_hook = pgss_ExecutorEnd;
	prev_ProcessUtility = ProcessUtility_hook;
	ProcessUtility_hook = pgss_ProcessUtility;
}
Esempio n. 26
0
/* Register Citus configuration variables. */
static void
RegisterCitusConfigVariables(void)
{
	DefineCustomStringVariable(
		"citus.worker_list_file",
		gettext_noop("Sets the server's \"worker_list\" configuration file."),
		NULL,
		&WorkerListFileName,
		NULL,
		PGC_POSTMASTER,
		GUC_SUPERUSER_ONLY,
		NULL, NULL, NULL);
	NormalizeWorkerListPath();

	DefineCustomBoolVariable(
		"citus.binary_master_copy_format",
		gettext_noop("Use the binary master copy format."),
		gettext_noop("When enabled, data is copied from workers to the master "
					 "in PostgreSQL's binary serialization format."),
		&BinaryMasterCopyFormat,
		false,
		PGC_USERSET,
		0,
		NULL, NULL, NULL);

	DefineCustomBoolVariable(
		"citus.binary_worker_copy_format",
		gettext_noop("Use the binary worker copy format."),
		gettext_noop("When enabled, data is copied from workers to workers "
					 "in PostgreSQL's binary serialization format when "
					 "joining large tables."),
		&BinaryWorkerCopyFormat,
		false,
		PGC_SIGHUP,
		0,
		NULL, NULL, NULL);

	DefineCustomBoolVariable(
		"citus.expire_cached_shards",
		gettext_noop("Enables shard cache expiration if a shard's size on disk has "
					 "changed."),
		gettext_noop("When appending to an existing shard, old data may still be cached "
					 "on other workers. This configuration entry activates automatic "
					 "expiration, but should not be used with manual updates to shards."),
		&ExpireCachedShards,
		false,
		PGC_SIGHUP,
		0,
		NULL, NULL, NULL);

	DefineCustomBoolVariable(
		"citus.subquery_pushdown",
		gettext_noop("Enables supported subquery pushdown to workers."),
		NULL,
		&SubqueryPushdown,
		false,
		PGC_USERSET,
		0,
		NULL, NULL, NULL);

	DefineCustomBoolVariable(
		"citus.log_multi_join_order",
		gettext_noop("Logs the distributed join order to the server log."),
		gettext_noop("We use this private configuration entry as a debugging aid. "
					 "If enabled, we print the distributed join order."),
		&LogMultiJoinOrder,
		false,
		PGC_USERSET,
		GUC_NO_SHOW_ALL,
		NULL, NULL, NULL);

	DefineCustomBoolVariable(
		"citus.explain_multi_logical_plan",
		gettext_noop("Enables Explain to print out distributed logical plans."),
		gettext_noop("We use this private configuration entry as a debugging aid. "
					 "If enabled, the Explain command prints out the optimized "
					 "logical plan for distributed queries."),
		&ExplainMultiLogicalPlan,
		false,
		PGC_USERSET,
		GUC_NO_SHOW_ALL,
		NULL, NULL, NULL);

	DefineCustomBoolVariable(
		"citus.explain_multi_physical_plan",
		gettext_noop("Enables Explain to print out distributed physical plans."),
		gettext_noop("We use this private configuration entry as a debugging aid. "
					 "If enabled, the Explain command prints out the physical "
					 "plan for distributed queries."),
		&ExplainMultiPhysicalPlan,
		false,
		PGC_USERSET,
		GUC_NO_SHOW_ALL,
		NULL, NULL, NULL);

	DefineCustomBoolVariable(
		"citus.explain_distributed_queries",
		gettext_noop("Enables Explain for distributed queries."),
		gettext_noop("When enabled, the Explain command shows remote and local "
					 "plans when used with a distributed query. It is enabled "
					 "by default, but can be disabled for regression tests."),
		&ExplainDistributedQueries,
		true,
		PGC_USERSET,
		GUC_NO_SHOW_ALL,
		NULL, NULL, NULL);

	DefineCustomBoolVariable(
		"citus.explain_all_tasks",
		gettext_noop("Enables showing output for all tasks in Explain."),
		gettext_noop("The Explain command for distributed queries shows "
					 "the remote plan for a single task by default. When "
					 "this configuration entry is enabled, the plan for "
					 "all tasks is shown, but the Explain takes longer."),
		&ExplainAllTasks,
		false,
		PGC_USERSET,
		0,
		NULL, NULL, NULL);

	DefineCustomBoolVariable(
		"citus.all_modifications_commutative",
		gettext_noop("Bypasses commutativity checks when enabled"),
		NULL,
		&AllModificationsCommutative,
		false,
		PGC_USERSET,
		0,
		NULL, NULL, NULL);

	DefineCustomBoolVariable(
		"citus.enable_ddl_propagation",
		gettext_noop("Enables propagating DDL statements to worker shards"),
		NULL,
		&EnableDDLPropagation,
		true,
		PGC_USERSET,
		0,
		NULL, NULL, NULL);

	DefineCustomIntVariable(
		"citus.shard_replication_factor",
		gettext_noop("Sets the replication factor for shards."),
		gettext_noop("Shards are replicated across nodes according to this "
					 "replication factor. Note that shards read this "
					 "configuration value at sharded table creation time, "
					 "and later reuse the initially read value."),
		&ShardReplicationFactor,
		2, 1, 100,
		PGC_USERSET,
		0,
		NULL, NULL, NULL);

	DefineCustomIntVariable(
		"citus.shard_max_size",
		gettext_noop("Sets the maximum size a shard will grow before it gets split."),
		gettext_noop("Shards store table and file data. When the source "
					 "file's size for one shard exceeds this configuration "
					 "value, the database ensures that either a new shard "
					 "gets created, or the current one gets split. Note that "
					 "shards read this configuration value at sharded table "
					 "creation time, and later reuse the initially read value."),
		&ShardMaxSize,
		1048576, 256, INT_MAX, /* max allowed size not set to MAX_KILOBYTES on purpose */
		PGC_USERSET,
		GUC_UNIT_KB,
		NULL, NULL, NULL);

	DefineCustomIntVariable(
		"citus.max_worker_nodes_tracked",
		gettext_noop("Sets the maximum number of worker nodes that are tracked."),
		gettext_noop("Worker nodes' network locations, their membership and "
					 "health status are tracked in a shared hash table on "
					 "the master node. This configuration value limits the "
					 "size of the hash table, and consequently the maximum "
					 "number of worker nodes that can be tracked."),
		&MaxWorkerNodesTracked,
		2048, 8, INT_MAX,
		PGC_POSTMASTER,
		0,
		NULL, NULL, NULL);

	DefineCustomIntVariable(
		"citus.remote_task_check_interval",
		gettext_noop("Sets the frequency at which we check job statuses."),
		gettext_noop("The master node assigns tasks to workers nodes, and "
					 "then regularly checks with them about each task's "
					 "progress. This configuration value sets the time "
					 "interval between two consequent checks."),
		&RemoteTaskCheckInterval,
		10, 1, REMOTE_NODE_CONNECT_TIMEOUT,
		PGC_USERSET,
		GUC_UNIT_MS,
		NULL, NULL, NULL);

	DefineCustomIntVariable(
		"citus.task_tracker_delay",
		gettext_noop("Task tracker sleep time between task management rounds."),
		gettext_noop("The task tracker process wakes up regularly, walks over "
					 "all tasks assigned to it, and schedules and executes these "
					 "tasks. Then, the task tracker sleeps for a time period "
					 "before walking over these tasks again. This configuration "
					 "value determines the length of that sleeping period."),
		&TaskTrackerDelay,
		200, 10, 100000,
		PGC_SIGHUP,
		GUC_UNIT_MS,
		NULL, NULL, NULL);

	DefineCustomIntVariable(
		"citus.max_assign_task_batch_size",
		gettext_noop("Sets the maximum number of tasks to assign per round."),
		gettext_noop("The master node synchronously assigns tasks to workers in "
					 "batches. Bigger batches allow for faster task assignment, "
					 "but it may take longer for all workers to get tasks "
					 "if the number of workers is large. This configuration "
					 "value controls the maximum batch size."),
		&MaxAssignTaskBatchSize,
		64, 1, INT_MAX,
		PGC_USERSET,
		0,
		NULL, NULL, NULL);

	DefineCustomIntVariable(
		"citus.max_tracked_tasks_per_node",
		gettext_noop("Sets the maximum number of tracked tasks per node."),
		gettext_noop("The task tracker processes keeps all assigned tasks in "
					 "a shared hash table, and schedules and executes these "
					 "tasks as appropriate. This configuration value limits "
					 "the size of the hash table, and therefore the maximum "
					 "number of tasks that can be tracked at any given time."),
		&MaxTrackedTasksPerNode,
		1024, 8, INT_MAX,
		PGC_POSTMASTER,
		0,
		NULL, NULL, NULL);

	DefineCustomIntVariable(
		"citus.max_running_tasks_per_node",
		gettext_noop("Sets the maximum number of tasks to run concurrently per node."),
		gettext_noop("The task tracker process schedules and executes the tasks "
					 "assigned to it as appropriate. This configuration value "
					 "sets the maximum number of tasks to execute concurrently "
					 "on one node at any given time."),
		&MaxRunningTasksPerNode,
		8, 1, INT_MAX,
		PGC_SIGHUP,
		0,
		NULL, NULL, NULL);

	DefineCustomIntVariable(
		"citus.partition_buffer_size",
		gettext_noop("Sets the buffer size to use for partition operations."),
		gettext_noop("Worker nodes allow for table data to be repartitioned "
					 "into multiple text files, much like Hadoop's Map "
					 "command. This configuration value sets the buffer size "
					 "to use per partition operation. After the buffer fills "
					 "up, we flush the repartitioned data into text files."),
		&PartitionBufferSize,
		8192, 0, (INT_MAX / 1024), /* result stored in int variable */
		PGC_USERSET,
		GUC_UNIT_KB,
		NULL, NULL, NULL);

	DefineCustomIntVariable(
		"citus.large_table_shard_count",
		gettext_noop("The shard count threshold over which a table is considered large."),
		gettext_noop("A distributed table is considered to be large if it has "
					 "more shards than the value specified here. This largeness "
					 "criteria is then used in picking a table join order during "
					 "distributed query planning."),
		&LargeTableShardCount,
		4, 1, 10000,
		PGC_USERSET,
		0,
		NULL, NULL, NULL);

	DefineCustomIntVariable(
		"citus.limit_clause_row_fetch_count",
		gettext_noop("Number of rows to fetch per task for limit clause optimization."),
		gettext_noop("Select queries get partitioned and executed as smaller "
					 "tasks. In some cases, select queries with limit clauses "
					 "may need to fetch all rows from each task to generate "
					 "results. In those cases, and where an approximation would "
					 "produce meaningful results, this configuration value sets "
					 "the number of rows to fetch from each task."),
		&LimitClauseRowFetchCount,
		-1, -1, INT_MAX,
		PGC_USERSET,
		0,
		NULL, NULL, NULL);

	DefineCustomRealVariable(
		"citus.count_distinct_error_rate",
		gettext_noop("Desired error rate when calculating count(distinct) "
					 "approximates using the postgresql-hll extension. "
					 "0.0 disables approximations for count(distinct); 1.0 "
					 "provides no guarantees about the accuracy of results."),
		NULL,
		&CountDistinctErrorRate,
		0.0, 0.0, 1.0,
		PGC_USERSET,
		0,
		NULL, NULL, NULL);

	DefineCustomEnumVariable(
		"citus.multi_shard_commit_protocol",
		gettext_noop("Sets the commit protocol for commands modifying multiple shards."),
		gettext_noop("When a failure occurs during commands that modify multiple "
					 "shards (currently, only COPY on distributed tables modifies more "
					 "than one shard), two-phase commit is required to ensure data is "
					 "never lost. Change this setting to '2pc' from its default '1pc' to "
					 "enable 2 PC. You must also set max_prepared_transactions on the "
					 "worker nodes. Recovery from failed 2PCs is currently manual."),
		&MultiShardCommitProtocol,
		COMMIT_PROTOCOL_1PC,
		multi_shard_commit_protocol_options,
		PGC_USERSET,
		0,
		NULL, NULL, NULL);

	DefineCustomEnumVariable(
		"citus.task_assignment_policy",
		gettext_noop("Sets the policy to use when assigning tasks to worker nodes."),
		gettext_noop("The master node assigns tasks to worker nodes based on shard "
					 "locations. This configuration value specifies the policy to "
					 "use when making these assignments. The greedy policy aims to "
					 "evenly distribute tasks across worker nodes, first-replica just "
					 "assigns tasks in the order shard placements were created, "
					 "and the round-robin policy assigns tasks to worker nodes in "
					 "a round-robin fashion."),
		&TaskAssignmentPolicy,
		TASK_ASSIGNMENT_GREEDY,
		task_assignment_policy_options,
		PGC_USERSET,
		0,
		NULL, NULL, NULL);

	DefineCustomEnumVariable(
		"citus.task_executor_type",
		gettext_noop("Sets the executor type to be used for distributed queries."),
		gettext_noop("The master node chooses between two different executor types "
					 "when executing a distributed query.The real-time executor is "
					 "optimal for simple key-value lookup queries and queries that "
					 "involve aggregations and/or co-located joins on multiple shards. "
					 "The task-tracker executor is optimal for long-running, complex "
					 "queries that touch thousands of shards and/or that involve table "
					 "repartitioning."),
		&TaskExecutorType,
		MULTI_EXECUTOR_REAL_TIME,
		task_executor_type_options,
		PGC_USERSET,
		0,
		NULL, NULL, NULL);

	DefineCustomEnumVariable(
		"citus.shard_placement_policy",
		gettext_noop("Sets the policy to use when choosing nodes for shard placement."),
		gettext_noop("The master node chooses which worker nodes to place new shards "
					 "on. This configuration value specifies the policy to use when "
					 "selecting these nodes. The local-node-first policy places the "
					 "first replica on the client node and chooses others randomly. "
					 "The round-robin policy aims to distribute shards evenly across "
					 "the cluster by selecting nodes in a round-robin fashion."
					 "The random policy picks all workers randomly."),
		&ShardPlacementPolicy,
		SHARD_PLACEMENT_ROUND_ROBIN, shard_placement_policy_options,
		PGC_USERSET,
		0,
		NULL, NULL, NULL);

	/* warn about config items in the citus namespace that are not registered above */
	EmitWarningsOnPlaceholders("citus");
}
Esempio n. 27
0
/*
 * Module load callback
 */
void
_PG_init(void)
{

	/*
	 * In order to create our shared memory area, we have to be loaded via
	 * shared_preload_libraries.  If not, fall out without hooking into any of
	 * the main system.  (We don't throw error here because it seems useful to
	 * allow the query_histogram functions to be created even when the
	 * module isn't active.  The functions must protect themselves against
	 * being called then, however.)
	 */
	if (!process_shared_preload_libraries_in_progress)
		return;

	/* Define custom GUC variables. */
	DefineCustomBoolVariable("query_histogram.dynamic",
							  "Dynamic histogram may be modified on the fly.",
							 NULL,
							 &default_histogram_dynamic,
							 false,
							 PGC_BACKEND,
							 0,
							 NULL,
							 NULL,
							 NULL);

	/* Define custom GUC variables. */
	DefineCustomBoolVariable("query_histogram.track_utility",
							  "Selects whether utility commands are tracked.",
							 NULL,
							 &default_histogram_utility,
							 true,
							 PGC_SUSET,
							 0,
							 NULL,
							 &set_histogram_track_utility,
							 &show_histogram_track_utility);

	DefineCustomIntVariable("query_histogram.bin_count",
						 "Sets the number of bins of the histogram.",
						 "Zero disables collecting the histogram.",
							&default_histogram_bins,
							100,
							0, 1000,
							PGC_SUSET,
							0,
							NULL,
							&set_histogram_bins_count_hook,
							&show_histogram_bins_count_hook);

	DefineCustomIntVariable("query_histogram.bin_width",
						 "Sets the width of the histogram bin.",
							NULL,
							&default_histogram_step,
							100,
							1, 1000,
							PGC_SUSET,
							GUC_UNIT_MS,
							NULL,
							&set_histogram_bins_width_hook,
							&show_histogram_bins_width_hook);

	DefineCustomIntVariable("query_histogram.sample_pct",
						 "What portion of the queries should be sampled (in percent).",
							NULL,
							&default_histogram_sample_pct,
							5,
							1, 100,
							PGC_SUSET,
							0,
							NULL,
							&set_histogram_sample_hook,
							&show_histogram_sample_hook);

	DefineCustomEnumVariable("query_histogram.histogram_type",
							 "Type of the histogram (how the bin width is computed).",
							 NULL,
							 &default_histogram_type,
							 HISTOGRAM_LINEAR,
							 histogram_type_options,
							 PGC_SUSET,
							 0,
							 NULL,
							 &set_histogram_type_hook,
							 &show_histogram_type_hook);

	EmitWarningsOnPlaceholders("query_histogram");

	/*
	 * Request additional shared resources.  (These are no-ops if we're not in
	 * the postmaster process.)  We'll allocate or attach to the shared
	 * resources in histogram_shmem_startup().
	 */
	RequestAddinShmemSpace(get_histogram_size());
	RequestNamedLWLockTranche("query_histogram", 1);

	/* Install hooks. */
	prev_shmem_startup_hook = shmem_startup_hook;
	shmem_startup_hook = histogram_shmem_startup;

	prev_ExecutorStart = ExecutorStart_hook;
	ExecutorStart_hook = histogram_ExecutorStart;
	prev_ExecutorRun = ExecutorRun_hook;
	ExecutorRun_hook = histogram_ExecutorRun;
	prev_ExecutorFinish = ExecutorFinish_hook;
	ExecutorFinish_hook = histogram_ExecutorFinish;
	prev_ExecutorEnd = ExecutorEnd_hook;
	ExecutorEnd_hook = histogram_ExecutorEnd;
	prev_ProcessUtility = ProcessUtility_hook;
	ProcessUtility_hook = queryhist_ProcessUtility;
}