60#include "utils/fmgroids.h"
112static char *
get_sql_insert(
Relation rel,
int *pkattnums,
int pknumatts,
char **src_pkattvals,
char **tgt_pkattvals);
114static char *
get_sql_update(
Relation rel,
int *pkattnums,
int pknumatts,
char **src_pkattvals,
char **tgt_pkattvals);
129 int **pkattnums,
int *pknumatts);
187 (
errcode(ERRCODE_CONNECTION_DOES_NOT_EXIST),
188 errmsg(
"connection \"%s\" not available", conname)));
191 (
errcode(ERRCODE_CONNECTION_DOES_NOT_EXIST),
192 errmsg(
"connection not available")));
197 PGconn *
volatile *conn_p,
char **conname_p,
volatile bool *freeconn_p)
207 conname = conname_or_str;
232 (
errcode(ERRCODE_SQLCLIENT_UNABLE_TO_ESTABLISH_SQLCONNECTION),
233 errmsg(
"could not establish connection"),
244 *conname_p = conname;
245 *freeconn_p = freeconn;
282 char *conname_or_str = NULL;
284 char *connname = NULL;
331 (
errcode(ERRCODE_SQLCLIENT_UNABLE_TO_ESTABLISH_SQLCONNECTION),
332 errmsg(
"could not establish connection"),
365 char *conname = NULL;
405 char *curname = NULL;
407 char *conname = NULL;
450 if (!rconn || !rconn->
conn)
481 "while opening cursor \"%s\"", curname);
498 char *curname = NULL;
499 char *conname = NULL;
538 if (!rconn || !rconn->
conn)
550 "while closing cursor \"%s\"", curname);
584 char *conname = NULL;
588 char *curname = NULL;
654 "while fetching from cursor \"%s\"", curname);
662 (
errcode(ERRCODE_INVALID_CURSOR_NAME),
663 errmsg(
"cursor \"%s\" does not exist", curname)));
695 elog(
ERROR,
"wrong number of arguments");
716 volatile bool freeconn =
false;
725 char *conname = NULL;
762 elog(
ERROR,
"wrong number of arguments");
782 elog(
ERROR,
"wrong number of arguments");
805 "while executing query");
840 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
841 errmsg(
"set-valued function called in context that cannot accept a set")));
844 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
845 errmsg(
"materialize mode required, but it is not allowed in this context")));
904 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
905 errmsg(
"function returning record called in context "
906 "that cannot accept type record")));
910 elog(
ERROR,
"return type must be a row type");
923 if (nfields != tupdesc->
natts)
925 (
errcode(ERRCODE_DATATYPE_MISMATCH),
926 errmsg(
"remote query result rowtype does not match "
927 "the specified FROM clause rowtype")));
953 for (row = 0; row < ntuples; row++)
961 for (
i = 0;
i < nfields;
i++)
1002 const char *conname,
1013 sinfo.fcinfo = fcinfo;
1019 "dblink temporary context",
1037 "while executing query");
1064 rsinfo->setResult = tupstore;
1065 rsinfo->setDesc = tupdesc;
1081 Assert(rsinfo->setResult != NULL);
1088 if (sinfo.tmpcontext != NULL)
1090 sinfo.tmpcontext = NULL;
1093 sinfo.last_res = NULL;
1095 sinfo.cur_res = NULL;
1126 elog(
ERROR,
"failed to set single-row mode for dblink query");
1145 if (first && nestlevel < 0)
1215 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1216 errmsg(
"function returning record called in context "
1217 "that cannot accept type record")));
1221 elog(
ERROR,
"return type must be a row type");
1229 if (nfields != tupdesc->
natts)
1231 (
errcode(ERRCODE_DATATYPE_MISMATCH),
1232 errmsg(
"remote query result rowtype does not match "
1233 "the specified FROM clause rowtype")));
1271 for (
i = 0;
i < nfields;
i++)
1394 if (msg == NULL || msg[0] ==
'\0')
1407 text *
volatile sql_cmd_status = NULL;
1409 volatile bool freeconn =
false;
1417 char *conname = NULL;
1452 elog(
ERROR,
"wrong number of arguments");
1463 "while executing command");
1484 (
errcode(ERRCODE_S_R_E_PROHIBITED_SQL_STATEMENT_ATTEMPTED),
1485 errmsg(
"statement returning results not allowed")));
1556 if ((results != NULL) && (indnkeyatts > 0))
1585 if (call_cntr < max_calls)
1593 values[1] = results[call_cntr];
1642 char **src_pkattvals;
1643 char **tgt_pkattvals;
1657 &pkattnums, &pknumatts);
1668 if (src_nitems != pknumatts)
1670 (
errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
1671 errmsg(
"source key array length must match number of key attributes")));
1682 if (tgt_nitems != pknumatts)
1684 (
errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
1685 errmsg(
"target key array length must match number of key attributes")));
1690 sql =
get_sql_insert(rel, pkattnums, pknumatts, src_pkattvals, tgt_pkattvals);
1730 char **tgt_pkattvals;
1743 &pkattnums, &pknumatts);
1754 if (tgt_nitems != pknumatts)
1756 (
errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
1757 errmsg(
"target key array length must match number of key attributes")));
1807 char **src_pkattvals;
1808 char **tgt_pkattvals;
1822 &pkattnums, &pknumatts);
1833 if (src_nitems != pknumatts)
1835 (
errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
1836 errmsg(
"source key array length must match number of key attributes")));
1847 if (tgt_nitems != pknumatts)
1849 (
errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
1850 errmsg(
"target key array length must match number of key attributes")));
1855 sql =
get_sql_update(rel, pkattnums, pknumatts, src_pkattvals, tgt_pkattvals);
1890#define DBLINK_NOTIFY_COLS 3
1915 memset(nulls, 0,
sizeof(nulls));
1924 if (notify->
extra != NULL)
1967 (
errcode(ERRCODE_FDW_OUT_OF_MEMORY),
1969 errdetail(
"Could not get libpq's default connection options.")));
1973 foreach(cell, options_list)
1985 const char *closest_match;
1987 bool has_valid_options =
false;
1994 has_valid_options =
true;
2001 (
errcode(ERRCODE_FDW_OPTION_NAME_NOT_FOUND),
2003 has_valid_options ? closest_match ?
2004 errhint(
"Perhaps you meant the option \"%s\".",
2005 closest_match) : 0 :
2006 errhint(
"There are no valid options in this context.")));
2033 char **result = NULL;
2044 Anum_pg_index_indrelid,
2056 if (
index->indisprimary)
2058 *indnkeyatts =
index->indnkeyatts;
2059 if (*indnkeyatts > 0)
2063 for (
i = 0;
i < *indnkeyatts;
i++)
2110 if (bitmap && (*bitmap & bitmask) == 0)
2125 if (bitmask == 0x100)
2155 natts = tupdesc->
natts;
2160 (
errcode(ERRCODE_CARDINALITY_VIOLATION),
2161 errmsg(
"source row not found")));
2166 for (
i = 0;
i < natts;
i++)
2170 if (att->attisdropped)
2187 for (
i = 0;
i < natts;
i++)
2232 for (
i = 0;
i < pknumatts;
i++)
2234 int pkattnum = pkattnums[
i];
2243 if (tgt_pkattvals[
i] != NULL)
2272 natts = tupdesc->
natts;
2277 (
errcode(ERRCODE_CARDINALITY_VIOLATION),
2278 errmsg(
"source row not found")));
2286 for (
i = 0;
i < natts;
i++)
2290 if (attr->attisdropped)
2318 for (
i = 0;
i < pknumatts;
i++)
2320 int pkattnum = pkattnums[
i];
2329 val = tgt_pkattvals[
i];
2367 for (
i = 0;
i < pknumatts;
i++)
2368 if (
key == pkattnums[
i])
2396 natts = tupdesc->
natts;
2407 for (
i = 0;
i < natts;
i++)
2414 if (attr->attisdropped)
2423 for (
i = 0;
i < pknumatts;
i++)
2425 int pkattnum = pkattnums[
i];
2434 if (src_pkattvals[
i] != NULL)
2452 (
errcode(ERRCODE_CARDINALITY_VIOLATION),
2453 errmsg(
"source criteria matched more than one record")));
2543 return hentry->
rconn;
2582 errmsg(
"duplicate connection name")));
2585 hentry->
rconn = rconn;
2605 (
errcode(ERRCODE_UNDEFINED_OBJECT),
2606 errmsg(
"undefined connection name")));
2623 bool has_scram_server_key =
false;
2624 bool has_scram_client_key =
false;
2625 bool has_require_auth =
false;
2626 bool has_scram_keys =
false;
2638 if (strcmp(
option->keyword,
"require_auth") == 0)
2641 has_require_auth =
true;
2643 has_require_auth =
false;
2646 if (strcmp(
option->keyword,
"scram_client_key") == 0)
2649 has_scram_client_key =
true;
2651 has_scram_client_key =
false;
2654 if (strcmp(
option->keyword,
"scram_server_key") == 0)
2657 has_scram_server_key =
true;
2659 has_scram_server_key =
false;
2667 return (has_scram_keys && has_require_auth);
2710 (
errcode(ERRCODE_S_R_E_PROHIBITED_SQL_STATEMENT_ATTEMPTED),
2711 errmsg(
"password or GSSAPI delegated credentials required"),
2712 errdetail(
"Non-superusers may only connect using credentials they provide, eg: password in connection string or delegated GSSAPI credentials"),
2713 errhint(
"Ensure provided credentials match target server's authentication method.")));
2727 bool connstr_gives_password =
false;
2734 if (strcmp(
option->keyword,
"password") == 0)
2738 connstr_gives_password =
true;
2746 return connstr_gives_password;
2777 (
errcode(ERRCODE_S_R_E_PROHIBITED_SQL_STATEMENT_ATTEMPTED),
2778 errmsg(
"password or GSSAPI delegated credentials required"),
2779 errdetail(
"Non-superusers must provide a password in the connection string or send delegated GSSAPI credentials.")));
2792 bool fail,
const char *fmt,...)
2801 char *message_primary;
2802 char *message_detail;
2804 char *message_context;
2806 char dblink_context_msg[512];
2813 if (pg_diag_sqlstate)
2815 pg_diag_sqlstate[1],
2816 pg_diag_sqlstate[2],
2817 pg_diag_sqlstate[3],
2818 pg_diag_sqlstate[4]);
2820 sqlstate = ERRCODE_CONNECTION_FAILURE;
2822 message_primary =
xpstrdup(pg_diag_message_primary);
2823 message_detail =
xpstrdup(pg_diag_message_detail);
2824 message_hint =
xpstrdup(pg_diag_message_hint);
2825 message_context =
xpstrdup(pg_diag_context);
2832 if (message_primary == NULL)
2851 vsnprintf(dblink_context_msg,
sizeof(dblink_context_msg), fmt, ap);
2856 (message_primary != NULL && message_primary[0] !=
'\0') ?
2858 errmsg(
"could not obtain message string for remote error"),
2860 message_hint ?
errhint(
"%s", message_hint) : 0,
2861 message_context ? (
errcontext(
"%s", message_context)) : 0,
2863 (
errcontext(
"%s on dblink connection named \"%s\"",
2864 dblink_context_msg, conname)) :
2865 (
errcontext(
"%s on unnamed dblink connection",
2866 dblink_context_msg))));
2899 (
errcode(ERRCODE_FDW_OUT_OF_MEMORY),
2901 errdetail(
"Could not get libpq's default connection options.")));
2905 srvname =
pstrdup(servername);
2940 foreach(cell, foreign_server->
options)
2949 foreach(cell, user_mapping->
options)
2978 for (cp =
str; *cp; cp++)
2980 if (*cp ==
'\\' || *cp ==
'\'')
3006 int **pkattnums,
int *pknumatts)
3009 int natts = tupdesc->
natts;
3013 pknumatts_arg =
Min(pknumatts_arg, pkattnums_arg->
dim1);
3016 if (pknumatts_arg <= 0)
3018 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
3019 errmsg(
"number of key attributes must be > 0")));
3023 *pknumatts = pknumatts_arg;
3026 for (
i = 0;
i < pknumatts_arg;
i++)
3028 int pkattnum = pkattnums_arg->
values[
i];
3033 if (pkattnum <= 0 || pkattnum > natts)
3035 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
3036 errmsg(
"invalid attribute number %d", pkattnum)));
3040 for (
j = 0;
j < natts;
j++)
3046 if (++lnum == pkattnum)
3051 (*pkattnums)[
i] =
j;
3054 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
3055 errmsg(
"invalid attribute number %d", pkattnum)));
3094 if (strcmp(opt->
keyword,
"client_encoding") == 0)
3103 if (context != UserMappingRelationId)
3108 if (context != ForeignServerRelationId)
3123 if (strcmp(
option,
"use_scram_passthrough") == 0)
3142 static const char *
const GUCsAffectingIO[] = {
3152 const char *gucName = GUCsAffectingIO[
i];
3154 const char *localVal;
3162 if (remoteVal == NULL)
3170 Assert(localVal != NULL);
3172 if (strcmp(remoteVal, localVal) == 0)
3217 if (encoded_len < 0)
3218 elog(
ERROR,
"could not encode SCRAM client key");
3226 if (encoded_len < 0)
3227 elog(
ERROR,
"could not encode SCRAM server key");
3243 foreach(cell, foreign_server->
options)
3247 if (strcmp(def->
defname,
"use_scram_passthrough") == 0)
3251 foreach(cell,
user->options)
3255 if (strcmp(def->
defname,
"use_scram_passthrough") == 0)
void aclcheck_error(AclResult aclerr, ObjectType objtype, const char *objectname)
AclResult object_aclcheck(Oid classid, Oid objectid, Oid roleid, AclMode mode)
AclResult pg_class_aclcheck(Oid table_oid, Oid roleid, AclMode mode)
#define PG_GETARG_ARRAYTYPE_P(n)
#define ARR_NULLBITMAP(a)
ArrayBuildState * accumArrayResult(ArrayBuildState *astate, Datum dvalue, bool disnull, Oid element_type, MemoryContext rcontext)
Datum makeArrayResult(ArrayBuildState *astate, MemoryContext rcontext)
int ArrayGetNItems(int ndim, const int *dims)
Datum current_query(PG_FUNCTION_ARGS)
TimestampTz GetCurrentTimestamp(void)
int pg_b64_enc_len(int srclen)
int pg_b64_encode(const char *src, int len, char *dst, int dstlen)
bool be_gssapi_get_delegation(Port *port)
static Datum values[MAXATTR]
#define CStringGetTextDatum(s)
#define TextDatumGetCString(d)
#define pg_attribute_printf(f, a)
static bool UseScramPassthrough(ForeignServer *foreign_server, UserMapping *user)
static bool dblink_connstr_has_pw(const char *connstr)
static void createNewConnection(const char *name, remoteConn *rconn)
static uint32 dblink_we_get_result
static pg_noreturn void dblink_res_internalerror(PGconn *conn, PGresult *res, const char *p2)
Datum dblink_get_result(PG_FUNCTION_ARGS)
static int get_attnum_pk_pos(int *pkattnums, int pknumatts, int key)
Datum dblink_build_sql_delete(PG_FUNCTION_ARGS)
Datum dblink_get_pkey(PG_FUNCTION_ARGS)
static bool is_valid_dblink_fdw_option(const PQconninfoOption *options, const char *option, Oid context)
Datum dblink_open(PG_FUNCTION_ARGS)
static remoteConn * pconn
static void dblink_security_check(PGconn *conn, remoteConn *rconn, const char *connstr)
static pg_noreturn void dblink_conn_not_avail(const char *conname)
static void appendSCRAMKeysInfo(StringInfo buf)
static HeapTuple get_tuple_of_interest(Relation rel, int *pkattnums, int pknumatts, char **src_pkattvals)
static uint32 dblink_we_connect
Datum dblink_close(PG_FUNCTION_ARGS)
static void restoreLocalGucs(int nestlevel)
PG_MODULE_MAGIC_EXT(.name="dblink",.version=PG_VERSION)
static char * escape_param_str(const char *str)
static char * xpstrdup(const char *in)
static char * quote_ident_cstr(char *rawstr)
static HTAB * createConnHash(void)
Datum dblink_exec(PG_FUNCTION_ARGS)
static void dblink_connstr_check(const char *connstr)
static char * get_sql_insert(Relation rel, int *pkattnums, int pknumatts, char **src_pkattvals, char **tgt_pkattvals)
static char * get_sql_update(Relation rel, int *pkattnums, int pknumatts, char **src_pkattvals, char **tgt_pkattvals)
static bool is_valid_dblink_option(const PQconninfoOption *options, const char *option, Oid context)
Datum dblink_build_sql_insert(PG_FUNCTION_ARGS)
static remoteConn * getConnectionByName(const char *name)
Datum dblink_get_notify(PG_FUNCTION_ARGS)
static HTAB * remoteConnHash
static void storeRow(volatile storeInfo *sinfo, PGresult *res, bool first)
Datum dblink_disconnect(PG_FUNCTION_ARGS)
static PGconn * dblink_get_named_conn(const char *conname)
static void dblink_get_conn(char *conname_or_str, PGconn *volatile *conn_p, char **conname_p, volatile bool *freeconn_p)
static int applyRemoteGucs(PGconn *conn)
Datum dblink_fdw_validator(PG_FUNCTION_ARGS)
static void dblink_init(void)
static Datum dblink_record_internal(FunctionCallInfo fcinfo, bool is_async)
Datum dblink_get_connections(PG_FUNCTION_ARGS)
static char ** get_pkey_attnames(Relation rel, int16 *indnkeyatts)
static void prepTuplestoreResult(FunctionCallInfo fcinfo)
static void dblink_res_error(PGconn *conn, const char *conname, PGresult *res, bool fail, const char *fmt,...) pg_attribute_printf(5
Datum dblink_record(PG_FUNCTION_ARGS)
static void materializeResult(FunctionCallInfo fcinfo, PGconn *conn, PGresult *res)
struct remoteConn remoteConn
Datum dblink_is_busy(PG_FUNCTION_ARGS)
static char ** get_text_array_contents(ArrayType *array, int *numitems)
static bool dblink_connstr_has_required_scram_options(const char *connstr)
static void static char * get_connect_string(const char *servername)
Datum dblink_connect(PG_FUNCTION_ARGS)
Datum dblink_current_query(PG_FUNCTION_ARGS)
Datum dblink_fetch(PG_FUNCTION_ARGS)
struct remoteConnHashEnt remoteConnHashEnt
Datum dblink_build_sql_update(PG_FUNCTION_ARGS)
static void deleteConnection(const char *name)
struct storeInfo storeInfo
static char * generate_relation_name(Relation rel)
#define DBLINK_NOTIFY_COLS
Datum dblink_cancel_query(PG_FUNCTION_ARGS)
Datum dblink_send_query(PG_FUNCTION_ARGS)
static char * get_sql_delete(Relation rel, int *pkattnums, int pknumatts, char **tgt_pkattvals)
Datum dblink_error_message(PG_FUNCTION_ARGS)
static void validate_pkattnums(Relation rel, int2vector *pkattnums_arg, int32 pknumatts_arg, int **pkattnums, int *pknumatts)
static void materializeQueryResult(FunctionCallInfo fcinfo, PGconn *conn, const char *conname, const char *sql, bool fail)
static PGresult * storeQueryResult(volatile storeInfo *sinfo, PGconn *conn, const char *sql)
static uint32 dblink_we_get_conn
PG_FUNCTION_INFO_V1(dblink_connect)
static Relation get_rel_from_relname(text *relname_text, LOCKMODE lockmode, AclMode aclmode)
bool defGetBoolean(DefElem *def)
void * hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action, bool *foundPtr)
void * hash_seq_search(HASH_SEQ_STATUS *status)
HTAB * hash_create(const char *tabname, long nelem, const HASHCTL *info, int flags)
void hash_seq_init(HASH_SEQ_STATUS *status, HTAB *hashp)
int errmsg_internal(const char *fmt,...)
int errdetail_internal(const char *fmt,...)
int errdetail(const char *fmt,...)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define MAKE_SQLSTATE(ch1, ch2, ch3, ch4, ch5)
#define ereport(elevel,...)
HeapTuple BuildTupleFromCStrings(AttInMetadata *attinmeta, char **values)
AttInMetadata * TupleDescGetAttInMetadata(TupleDesc tupdesc)
PGTransactionStatusType PQtransactionStatus(const PGconn *conn)
int PQconnectionUsedPassword(const PGconn *conn)
void PQconninfoFree(PQconninfoOption *connOptions)
PQconninfoOption * PQconninfoParse(const char *conninfo, char **errmsg)
const char * PQparameterStatus(const PGconn *conn, const char *paramName)
int PQconnectionUsedGSSAPI(const PGconn *conn)
ConnStatusType PQstatus(const PGconn *conn)
int PQclientEncoding(const PGconn *conn)
PQconninfoOption * PQconndefaults(void)
char * PQerrorMessage(const PGconn *conn)
int PQsetClientEncoding(PGconn *conn, const char *encoding)
int PQsetSingleRowMode(PGconn *conn)
void PQfreemem(void *ptr)
char * PQgetvalue(const PGresult *res, int tup_num, int field_num)
ExecStatusType PQresultStatus(const PGresult *res)
void PQclear(PGresult *res)
int PQntuples(const PGresult *res)
int PQconsumeInput(PGconn *conn)
int PQgetisnull(const PGresult *res, int tup_num, int field_num)
char * PQresultErrorField(const PGresult *res, int fieldcode)
int PQsendQuery(PGconn *conn, const char *query)
char * PQcmdStatus(PGresult *res)
int PQisBusy(PGconn *conn)
int PQnfields(const PGresult *res)
PGnotify * PQnotifies(PGconn *conn)
#define palloc_array(type, count)
Oid get_fn_expr_argtype(FmgrInfo *flinfo, int argnum)
#define PG_GETARG_TEXT_PP(n)
#define DatumGetTextPP(X)
#define PG_GETARG_POINTER(n)
#define DirectFunctionCall1(func, arg1)
#define PG_GETARG_DATUM(n)
#define PG_RETURN_TEXT_P(x)
#define PG_RETURN_INT32(x)
#define PG_GETARG_INT32(n)
#define PG_GETARG_BOOL(n)
#define PG_RETURN_DATUM(x)
ForeignDataWrapper * GetForeignDataWrapper(Oid fdwid)
ForeignServer * GetForeignServerByName(const char *srvname, bool missing_ok)
UserMapping * GetUserMapping(Oid userid, Oid serverid)
void InitMaterializedSRF(FunctionCallInfo fcinfo, bits32 flags)
TypeFuncClass get_call_result_type(FunctionCallInfo fcinfo, Oid *resultTypeId, TupleDesc *resultTupleDesc)
#define SRF_IS_FIRSTCALL()
#define SRF_PERCALL_SETUP()
#define SRF_RETURN_NEXT(_funcctx, _result)
#define SRF_FIRSTCALL_INIT()
static Datum HeapTupleGetDatum(const HeapTupleData *tuple)
#define SRF_RETURN_DONE(_funcctx)
void systable_endscan(SysScanDesc sysscan)
HeapTuple systable_getnext(SysScanDesc sysscan)
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
int NewGUCNestLevel(void)
const char * GetConfigOption(const char *name, bool missing_ok, bool restrict_privileged)
void AtEOXact_GUC(bool isCommit, int nestLevel)
int set_config_option(const char *name, const char *value, GucContext context, GucSource source, GucAction action, bool changeVal, int elevel, bool is_reload)
Assert(PointerIsAligned(start, uint64))
#define HeapTupleIsValid(tuple)
static void * GETSTRUCT(const HeapTupleData *tuple)
struct parser_state match_state[5]
if(TABLE==NULL||TABLE_index==NULL)
static const char * libpqsrv_cancel(PGconn *conn, TimestampTz endtime)
static PGresult * libpqsrv_exec(PGconn *conn, const char *query, uint32 wait_event_info)
static PGconn * libpqsrv_connect(const char *conninfo, uint32 wait_event_info)
static PGresult * libpqsrv_get_result(PGconn *conn, uint32 wait_event_info)
static void libpqsrv_disconnect(PGconn *conn)
void get_typlenbyvalalign(Oid typid, int16 *typlen, bool *typbyval, char *typalign)
char * get_namespace_name(Oid nspid)
int GetDatabaseEncoding(void)
const char * GetDatabaseEncodingName(void)
void * MemoryContextAlloc(MemoryContext context, Size size)
void MemoryContextReset(MemoryContext context)
char * pstrdup(const char *in)
void pfree(void *pointer)
void * palloc0(Size size)
MemoryContext TopMemoryContext
char * pchomp(const char *in)
MemoryContext CurrentMemoryContext
void MemoryContextDelete(MemoryContext context)
#define AllocSetContextCreate
#define ALLOCSET_DEFAULT_SIZES
#define CHECK_FOR_INTERRUPTS()
bool RelationIsVisible(Oid relid)
RangeVar * makeRangeVarFromNameList(const List *names)
#define IsA(nodeptr, _type_)
ObjectType get_relkind_objtype(char relkind)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
FormData_pg_attribute * Form_pg_attribute
static const char * connstr
FormData_pg_index * Form_pg_index
static Datum PointerGetDatum(const void *X)
static Datum ObjectIdGetDatum(Oid X)
static Datum Int32GetDatum(int32 X)
#define PG_DIAG_MESSAGE_HINT
#define PG_DIAG_MESSAGE_PRIMARY
#define PG_DIAG_MESSAGE_DETAIL
char * psprintf(const char *fmt,...)
char * quote_literal_cstr(const char *rawstr)
Datum quote_ident(PG_FUNCTION_ARGS)
#define RelationGetRelid(relation)
#define RelationGetRelationName(relation)
List * untransformRelOptions(Datum options)
char * quote_qualified_identifier(const char *qualifier, const char *ident)
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
void truncate_identifier(char *ident, int len, bool warn)
SPITupleTable * SPI_tuptable
int SPI_exec(const char *src, long tcount)
char * SPI_getvalue(HeapTuple tuple, TupleDesc tupdesc, int fnumber)
HeapTuple SPI_copytuple(HeapTuple tuple)
char * SPI_fname(TupleDesc tupdesc, int fnumber)
void relation_close(Relation relation, LOCKMODE lockmode)
#define BTEqualStrategyNumber
#define ERRCODE_DUPLICATE_OBJECT
void appendStringInfo(StringInfo str, const char *fmt,...)
void appendStringInfoString(StringInfo str, const char *s)
void appendStringInfoChar(StringInfo str, char ch)
void initStringInfo(StringInfo str)
MemoryContext ecxt_per_query_memory
AttInMetadata * attinmeta
MemoryContext multi_call_memory_ctx
uint8 scram_ServerKey[SCRAM_MAX_KEY_LEN]
uint8 scram_ClientKey[SCRAM_MAX_KEY_LEN]
SetFunctionReturnMode returnMode
Tuplestorestate * setResult
int16 values[FLEXIBLE_ARRAY_MEMBER]
Tuplestorestate * tuplestore
AttInMetadata * attinmeta
void table_close(Relation relation, LOCKMODE lockmode)
Relation table_open(Oid relationId, LOCKMODE lockmode)
Relation table_openrv(const RangeVar *relation, LOCKMODE lockmode)
TupleDesc CreateTemplateTupleDesc(int natts)
TupleDesc CreateTupleDescCopy(TupleDesc tupdesc)
void TupleDescInitEntry(TupleDesc desc, AttrNumber attributeNumber, const char *attributeName, Oid oidtypeid, int32 typmod, int attdim)
static FormData_pg_attribute * TupleDescAttr(TupleDesc tupdesc, int i)
Tuplestorestate * tuplestore_begin_heap(bool randomAccess, bool interXact, int maxKBytes)
void tuplestore_putvalues(Tuplestorestate *state, TupleDesc tdesc, const Datum *values, const bool *isnull)
void tuplestore_end(Tuplestorestate *state)
void tuplestore_puttuple(Tuplestorestate *state, HeapTuple tuple)
#define att_align_nominal(cur_offset, attalign)
#define att_addlength_pointer(cur_offset, attlen, attptr)
#define TimestampTzPlusMilliseconds(tz, ms)
const char * getClosestMatch(ClosestMatchState *state)
text * cstring_to_text(const char *s)
void initClosestMatch(ClosestMatchState *state, const char *source, int max_d)
void updateClosestMatch(ClosestMatchState *state, const char *candidate)
char * text_to_cstring(const text *t)
List * textToQualifiedNameList(text *textval)
uint32 WaitEventExtensionNew(const char *wait_event_name)