59 const char *query_string,
68#define SH_PREFIX pgsa_stash_name_table
69#define SH_ELEMENT_TYPE pgsa_stash_name
70#define SH_KEY_TYPE uint64
71#define SH_KEY pgsa_stash_id
72#define SH_HASH_KEY(tb, key) hash_bytes((const unsigned char *) &(key), sizeof(uint64))
73#define SH_EQUAL(tb, a, b) (a == b)
74#define SH_SCOPE extern
91 "Name of the advice stash to be used in this session.",
116 const char *query_string,
int cursorOptions,
154 key.queryId =
parse->queryId;
159 advice_string =
NULL;
166 if (advice_string !=
NULL)
167 elog(
DEBUG2,
"supplying automatic advice for stash \"%s\", query ID %" PRId64 ": %s",
170 return advice_string;
294 errmsg(
"advice stash name may not be zero length"));
300 errmsg(
"advice stash names may not be longer than %d bytes",
310 errmsg(
"advice stash name must not contain non-ASCII characters"));
320 errmsg(
"advice stash name must begin with a letter or underscore and contain only letters, digits, and underscores"));
360 GUC_check_errdetail(
"advice stash name must begin with a letter or underscore and contain only letters, digits, and underscores");
413 key.queryId = queryId;
495 if (*
str >=
'0' && *
str <=
'9')
502 if ((
c <
'0' ||
c >
'9') && (
c <
'a' ||
c >
'z') &&
503 (
c <
'A' ||
c >
'Z') &&
c !=
'_')
575 key.queryId = queryId;
589 errdetail(
"could not insert advice string into shared hash table"));
#define Assert(condition)
void * load_external_function(const char *filename, const char *funcname, bool signalNotFound, void **filehandle)
dsa_area * dsa_attach(dsa_handle handle)
void * dsa_get_address(dsa_area *area, dsa_pointer dp)
void dsa_pin_mapping(dsa_area *area)
dsa_handle dsa_get_handle(dsa_area *area)
void dsa_free(dsa_area *area, dsa_pointer dp)
void dsa_pin(dsa_area *area)
#define dsa_create(tranche_id)
#define dsa_allocate(area, size)
#define InvalidDsaPointer
#define DSA_HANDLE_INVALID
#define DsaPointerIsValid(x)
void dshash_memcpy(void *dest, const void *src, size_t size, void *arg)
void dshash_delete_entry(dshash_table *hash_table, void *entry)
void dshash_strcpy(void *dest, const void *src, size_t size, void *arg)
void dshash_release_lock(dshash_table *hash_table, void *entry)
void dshash_seq_init(dshash_seq_status *status, dshash_table *hash_table, bool exclusive)
void * dshash_find(dshash_table *hash_table, const void *key, bool exclusive)
dshash_hash dshash_strhash(const void *v, size_t size, void *arg)
dshash_table_handle dshash_get_hash_table_handle(dshash_table *hash_table)
dshash_table * dshash_attach(dsa_area *area, const dshash_parameters *params, dshash_table_handle handle, void *arg)
void dshash_seq_term(dshash_seq_status *status)
int dshash_strcmp(const void *a, const void *b, size_t size, void *arg)
dshash_hash dshash_memhash(const void *v, size_t size, void *arg)
void * dshash_seq_next(dshash_seq_status *status)
dshash_table * dshash_create(dsa_area *area, const dshash_parameters *params, void *arg)
int dshash_memcmp(const void *a, const void *b, size_t size, void *arg)
void * dshash_find_or_insert_extended(dshash_table *hash_table, const void *key, bool *found, int flags)
void dshash_delete_current(dshash_seq_status *status)
#define DSHASH_HANDLE_INVALID
dsa_pointer dshash_table_handle
#define DSHASH_INSERT_NO_OOM
#define dshash_find_or_insert(hash_table, key, found)
void * GetNamedDSMSegment(const char *name, size_t size, void(*init_callback)(void *ptr, void *arg), bool *found, void *arg)
int errcode(int sqlerrcode)
int errdetail(const char *fmt,...) pg_attribute_printf(1
#define ereport(elevel,...)
void GUC_check_errcode(int sqlerrcode)
void DefineCustomStringVariable(const char *name, const char *short_desc, const char *long_desc, char **valueAddr, const char *bootValue, GucContext context, int flags, GucStringCheckHook check_hook, GucStringAssignHook assign_hook, GucShowHook show_hook)
void MarkGUCPrefixReserved(const char *className)
#define GUC_check_errdetail
bool LWLockHeldByMe(LWLock *lock)
bool LWLockAcquire(LWLock *lock, LWLockMode mode)
int LWLockNewTrancheId(const char *name)
bool LWLockHeldByMeInMode(LWLock *lock, LWLockMode mode)
void LWLockRelease(LWLock *lock)
void LWLockInitialize(LWLock *lock, int tranche_id)
char * pstrdup(const char *in)
MemoryContext TopMemoryContext
#define AllocSetContextCreate
#define ALLOCSET_DEFAULT_SIZES
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
char *(* pg_plan_advice_advisor_hook)(PlannerGlobal *glob, Query *parse, const char *query_string, int cursorOptions, ExplainState *es)
static rewind_source * source
static char * pgsa_advisor(PlannerGlobal *glob, Query *parse, const char *query_string, int cursorOptions, ExplainState *es)
dshash_table * pgsa_entry_dshash
dshash_table * pgsa_stash_dshash
static MemoryContext pg_stash_advice_mcxt
void pgsa_create_stash(char *stash_name)
void pgsa_drop_stash(char *stash_name)
void pgsa_set_advice_string(char *stash_name, int64 queryId, char *advice_string)
static bool pgsa_is_identifier(char *str)
uint64 pgsa_lookup_stash_id(char *stash_name)
static dshash_parameters pgsa_stash_dshash_parameters
static char * pg_stash_advice_stash_name
static bool pgsa_check_stash_name_guc(char **newval, void **extra, GucSource source)
void pgsa_check_stash_name(char *stash_name)
pgsa_shared_state * pgsa_state
static dshash_parameters pgsa_entry_dshash_parameters
static void pgsa_init_shared_state(void *ptr, void *arg)
void pgsa_clear_advice_string(char *stash_name, int64 queryId)
bool pg_is_ascii(const char *str)
dsa_pointer advice_string
dshash_table_handle entry_hash
dshash_table_handle stash_hash