71 foreach(cell, options)
119 foreach(optcell, options)
128 foreach(cell, resultOptions)
147 (
errcode(ERRCODE_UNDEFINED_OBJECT),
148 errmsg(
"option \"%s\" not found",
156 (
errcode(ERRCODE_UNDEFINED_OBJECT),
157 errmsg(
"option \"%s\" not found",
167 errmsg(
"option \"%s\" provided more than once",
169 resultOptions =
lappend(resultOptions, od);
173 elog(
ERROR,
"unrecognized action %d on option \"%s\"",
183 Datum valarg = result;
208 Datum repl_val[Natts_pg_foreign_data_wrapper];
209 bool repl_null[Natts_pg_foreign_data_wrapper];
210 bool repl_repl[Natts_pg_foreign_data_wrapper];
220 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
221 errmsg(
"permission denied to change owner of foreign-data wrapper \"%s\"",
223 errhint(
"Must be superuser to change owner of a foreign-data wrapper.")));
228 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
229 errmsg(
"permission denied to change owner of foreign-data wrapper \"%s\"",
231 errhint(
"The owner of a foreign-data wrapper must be a superuser.")));
233 if (form->fdwowner != newOwnerId)
235 memset(repl_null,
false,
sizeof(repl_null));
236 memset(repl_repl,
false,
sizeof(repl_repl));
238 repl_repl[Anum_pg_foreign_data_wrapper_fdwowner - 1] =
true;
239 repl_val[Anum_pg_foreign_data_wrapper_fdwowner - 1] =
ObjectIdGetDatum(newOwnerId);
242 Anum_pg_foreign_data_wrapper_fdwacl,
249 form->fdwowner, newOwnerId);
250 repl_repl[Anum_pg_foreign_data_wrapper_fdwacl - 1] =
true;
251 repl_val[Anum_pg_foreign_data_wrapper_fdwacl - 1] =
PointerGetDatum(newAcl);
290 (
errcode(ERRCODE_UNDEFINED_OBJECT),
291 errmsg(
"foreign-data wrapper \"%s\" does not exist", name)));
324 (
errcode(ERRCODE_UNDEFINED_OBJECT),
325 errmsg(
"foreign-data wrapper with OID %u does not exist", fwdId)));
341 Datum repl_val[Natts_pg_foreign_server];
342 bool repl_null[Natts_pg_foreign_server];
343 bool repl_repl[Natts_pg_foreign_server];
350 if (form->srvowner != newOwnerId)
378 memset(repl_null,
false,
sizeof(repl_null));
379 memset(repl_repl,
false,
sizeof(repl_repl));
381 repl_repl[Anum_pg_foreign_server_srvowner - 1] =
true;
382 repl_val[Anum_pg_foreign_server_srvowner - 1] =
ObjectIdGetDatum(newOwnerId);
385 Anum_pg_foreign_server_srvacl,
392 form->srvowner, newOwnerId);
393 repl_repl[Anum_pg_foreign_server_srvacl - 1] =
true;
429 (
errcode(ERRCODE_UNDEFINED_OBJECT),
430 errmsg(
"server \"%s\" does not exist", name)));
461 (
errcode(ERRCODE_UNDEFINED_OBJECT),
462 errmsg(
"foreign server with OID %u does not exist", srvId)));
479 if (handler == NULL || handler->
arg == NULL)
488 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
489 errmsg(
"function %s must return type %s",
503 if (validator == NULL || validator->
arg == NULL)
507 funcargtypes[0] = TEXTARRAYOID;
508 funcargtypes[1] = OIDOID;
519 bool *handler_given,
Oid *fdwhandler,
520 bool *validator_given,
Oid *fdwvalidator)
524 *handler_given =
false;
525 *validator_given =
false;
530 foreach(cell, func_options)
534 if (strcmp(def->
defname,
"handler") == 0)
538 (
errcode(ERRCODE_SYNTAX_ERROR),
539 errmsg(
"conflicting or redundant options")));
540 *handler_given =
true;
543 else if (strcmp(def->
defname,
"validator") == 0)
545 if (*validator_given)
547 (
errcode(ERRCODE_SYNTAX_ERROR),
548 errmsg(
"conflicting or redundant options")));
549 *validator_given =
true;
553 elog(
ERROR,
"option \"%s\" not recognized",
566 bool nulls[Natts_pg_foreign_data_wrapper];
570 bool validator_given;
583 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
584 errmsg(
"permission denied to create foreign-data wrapper \"%s\"",
586 errhint(
"Must be superuser to create a foreign-data wrapper.")));
597 errmsg(
"foreign-data wrapper \"%s\" already exists",
603 memset(values, 0,
sizeof(values));
604 memset(nulls,
false,
sizeof(nulls));
607 Anum_pg_foreign_data_wrapper_oid);
609 values[Anum_pg_foreign_data_wrapper_fdwname - 1] =
611 values[Anum_pg_foreign_data_wrapper_fdwowner - 1] =
ObjectIdGetDatum(ownerId);
615 &handler_given, &fdwhandler,
616 &validator_given, &fdwvalidator);
618 values[Anum_pg_foreign_data_wrapper_fdwhandler - 1] =
ObjectIdGetDatum(fdwhandler);
619 values[Anum_pg_foreign_data_wrapper_fdwvalidator - 1] =
ObjectIdGetDatum(fdwvalidator);
621 nulls[Anum_pg_foreign_data_wrapper_fdwacl - 1] =
true;
629 values[Anum_pg_foreign_data_wrapper_fdwoptions - 1] = fdwoptions;
631 nulls[Anum_pg_foreign_data_wrapper_fdwoptions - 1] =
true;
640 myself.
classId = ForeignDataWrapperRelationId;
646 referenced.
classId = ProcedureRelationId;
654 referenced.
classId = ProcedureRelationId;
683 Datum repl_val[Natts_pg_foreign_data_wrapper];
684 bool repl_null[Natts_pg_foreign_data_wrapper];
685 bool repl_repl[Natts_pg_foreign_data_wrapper];
690 bool validator_given;
700 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
701 errmsg(
"permission denied to alter foreign-data wrapper \"%s\"",
703 errhint(
"Must be superuser to alter a foreign-data wrapper.")));
710 (
errcode(ERRCODE_UNDEFINED_OBJECT),
711 errmsg(
"foreign-data wrapper \"%s\" does not exist", stmt->
fdwname)));
714 fdwId = fdwForm->oid;
716 memset(repl_val, 0,
sizeof(repl_val));
717 memset(repl_null,
false,
sizeof(repl_null));
718 memset(repl_repl,
false,
sizeof(repl_repl));
721 &handler_given, &fdwhandler,
722 &validator_given, &fdwvalidator);
726 repl_val[Anum_pg_foreign_data_wrapper_fdwhandler - 1] =
ObjectIdGetDatum(fdwhandler);
727 repl_repl[Anum_pg_foreign_data_wrapper_fdwhandler - 1] =
true;
734 (
errmsg(
"changing the foreign-data wrapper handler can change behavior of existing foreign tables")));
739 repl_val[Anum_pg_foreign_data_wrapper_fdwvalidator - 1] =
ObjectIdGetDatum(fdwvalidator);
740 repl_repl[Anum_pg_foreign_data_wrapper_fdwvalidator - 1] =
true;
749 (
errmsg(
"changing the foreign-data wrapper validator can cause " 750 "the options for dependent objects to become invalid")));
757 fdwvalidator = fdwForm->fdwvalidator;
768 Anum_pg_foreign_data_wrapper_fdwoptions,
780 repl_val[Anum_pg_foreign_data_wrapper_fdwoptions - 1] = datum;
782 repl_null[Anum_pg_foreign_data_wrapper_fdwoptions - 1] =
true;
784 repl_repl[Anum_pg_foreign_data_wrapper_fdwoptions - 1] =
true;
789 repl_val, repl_null, repl_repl);
798 if (handler_given || validator_given)
815 referenced.
classId = ProcedureRelationId;
823 referenced.
classId = ProcedureRelationId;
847 bool nulls[Natts_pg_foreign_server];
871 errmsg(
"server \"%s\" already exists, skipping",
879 errmsg(
"server \"%s\" already exists",
896 memset(values, 0,
sizeof(values));
897 memset(nulls,
false,
sizeof(nulls));
900 Anum_pg_foreign_server_oid);
902 values[Anum_pg_foreign_server_srvname - 1] =
909 values[Anum_pg_foreign_server_srvtype - 1] =
912 nulls[Anum_pg_foreign_server_srvtype - 1] =
true;
916 values[Anum_pg_foreign_server_srvversion - 1] =
919 nulls[Anum_pg_foreign_server_srvversion - 1] =
true;
922 nulls[Anum_pg_foreign_server_srvacl - 1] =
true;
931 values[Anum_pg_foreign_server_srvoptions - 1] = srvoptions;
933 nulls[Anum_pg_foreign_server_srvoptions - 1] =
true;
942 myself.
classId = ForeignServerRelationId;
946 referenced.
classId = ForeignDataWrapperRelationId;
973 Datum repl_val[Natts_pg_foreign_server];
974 bool repl_null[Natts_pg_foreign_server];
975 bool repl_repl[Natts_pg_foreign_server];
987 (
errcode(ERRCODE_UNDEFINED_OBJECT),
991 srvId = srvForm->oid;
1000 memset(repl_val, 0,
sizeof(repl_val));
1001 memset(repl_null,
false,
sizeof(repl_null));
1002 memset(repl_repl,
false,
sizeof(repl_repl));
1010 repl_val[Anum_pg_foreign_server_srvversion - 1] =
1013 repl_null[Anum_pg_foreign_server_srvversion - 1] =
true;
1015 repl_repl[Anum_pg_foreign_server_srvversion - 1] =
true;
1027 Anum_pg_foreign_server_srvoptions,
1039 repl_val[Anum_pg_foreign_server_srvoptions - 1] = datum;
1041 repl_null[Anum_pg_foreign_server_srvoptions - 1] =
true;
1043 repl_repl[Anum_pg_foreign_server_srvoptions - 1] =
true;
1048 repl_val, repl_null, repl_repl);
1076 if (umuserid == curuserid)
1100 bool nulls[Natts_pg_user_mapping];
1125 umId =
GetSysCacheOid2(USERMAPPINGUSERSERVER, Anum_pg_user_mapping_oid,
1135 errmsg(
"user mapping for \"%s\" already exists for server \"%s\", skipping",
1145 errmsg(
"user mapping for \"%s\" already exists for server \"%s\"",
1155 memset(values, 0,
sizeof(values));
1156 memset(nulls,
false,
sizeof(nulls));
1159 Anum_pg_user_mapping_oid);
1171 values[Anum_pg_user_mapping_umoptions - 1] = useoptions;
1173 nulls[Anum_pg_user_mapping_umoptions - 1] =
true;
1182 myself.
classId = UserMappingRelationId;
1186 referenced.
classId = ForeignServerRelationId;
1221 Datum repl_val[Natts_pg_user_mapping];
1222 bool repl_null[Natts_pg_user_mapping];
1223 bool repl_repl[Natts_pg_user_mapping];
1239 umId =
GetSysCacheOid2(USERMAPPINGUSERSERVER, Anum_pg_user_mapping_oid,
1244 (
errcode(ERRCODE_UNDEFINED_OBJECT),
1245 errmsg(
"user mapping for \"%s\" does not exist for server \"%s\"",
1253 elog(
ERROR,
"cache lookup failed for user mapping %u", umId);
1255 memset(repl_val, 0,
sizeof(repl_val));
1256 memset(repl_null,
false,
sizeof(repl_null));
1257 memset(repl_repl,
false,
sizeof(repl_repl));
1273 Anum_pg_user_mapping_umoptions,
1285 repl_val[Anum_pg_user_mapping_umoptions - 1] = datum;
1287 repl_null[Anum_pg_user_mapping_umoptions - 1] =
true;
1289 repl_repl[Anum_pg_user_mapping_umoptions - 1] =
true;
1294 repl_val, repl_null, repl_repl);
1334 elog(
NOTICE,
"role \"%s\" does not exist, skipping",
1346 (
errcode(ERRCODE_UNDEFINED_OBJECT),
1347 errmsg(
"server \"%s\" does not exist",
1351 (
errmsg(
"server \"%s\" does not exist, skipping",
1356 umId =
GetSysCacheOid2(USERMAPPINGUSERSERVER, Anum_pg_user_mapping_oid,
1364 (
errcode(ERRCODE_UNDEFINED_OBJECT),
1365 errmsg(
"user mapping for \"%s\" does not exist for server \"%s\"",
1370 (
errmsg(
"user mapping for \"%s\" does not exist for server \"%s\", skipping",
1380 object.classId = UserMappingRelationId;
1381 object.objectId = umId;
1382 object.objectSubId = 0;
1400 bool nulls[Natts_pg_foreign_table];
1436 memset(values, 0,
sizeof(values));
1437 memset(nulls,
false,
sizeof(nulls));
1448 values[Anum_pg_foreign_table_ftoptions - 1] = ftoptions;
1450 nulls[Anum_pg_foreign_table_ftoptions - 1] =
true;
1459 myself.
classId = RelationRelationId;
1463 referenced.
classId = ForeignServerRelationId;
1497 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
1498 errmsg(
"foreign-data wrapper \"%s\" has no handler",
1503 (
errcode(ERRCODE_FDW_NO_SCHEMAS),
1504 errmsg(
"foreign-data wrapper \"%s\" does not support IMPORT FOREIGN SCHEMA",
1511 foreach(lc, cmd_list)
1513 char *cmd = (
char *)
lfirst(lc);
1516 List *raw_parsetree_list;
1524 callback_arg.
cmd = cmd;
1526 sqlerrcontext.
arg = (
void *) &callback_arg;
1539 foreach(lc2, raw_parsetree_list)
1551 "foreign-data wrapper \"%s\" returned incorrect statement type %d",
1567 pstmt->canSetTag =
false;
1568 pstmt->utilityStmt = (
Node *) cstmt;
1595 int syntaxerrposition;
1599 if (syntaxerrposition > 0)
ObjectAddress AlterForeignServer(AlterForeignServerStmt *stmt)
Oid GetNewOidWithIndex(Relation relation, Oid indexId, AttrNumber oidcolumn)
void CreateForeignTable(CreateForeignTableStmt *stmt, Oid relid)
#define IsA(nodeptr, _type_)
Datum namein(PG_FUNCTION_ARGS)
void table_close(Relation relation, LOCKMODE lockmode)
int errhint(const char *fmt,...)
static void parse_func_options(List *func_options, bool *handler_given, Oid *fdwhandler, bool *validator_given, Oid *fdwvalidator)
#define InvokeObjectPostCreateHook(classId, objectId, subId)
ObjectAddress CreateForeignDataWrapper(CreateFdwStmt *stmt)
void AlterForeignDataWrapperOwner_oid(Oid fwdId, Oid newOwnerId)
#define RelationGetDescr(relation)
Datum transformGenericOptions(Oid catalogId, Datum oldOptions, List *options, Oid fdwvalidator)
#define PointerGetDatum(X)
Oid LookupCreationNamespace(const char *nspname)
char * pstrdup(const char *in)
AclResult pg_foreign_data_wrapper_aclcheck(Oid fdw_oid, Oid roleid, AclMode mode)
bool pg_foreign_server_ownercheck(Oid srv_oid, Oid roleid)
void AlterForeignServerOwner_oid(Oid srvId, Oid newOwnerId)
#define ForeignDataWrapperOidIndexId
int errcode(int sqlerrcode)
#define ForeignServerOidIndexId
static void user_mapping_ddl_aclcheck(Oid umuserid, Oid serverid, const char *servername)
void recordDependencyOn(const ObjectAddress *depender, const ObjectAddress *referenced, DependencyType behavior)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, Datum *values, bool *isnull)
#define DirectFunctionCall1(func, arg1)
void recordDependencyOnOwner(Oid classId, Oid objectId, Oid owner)
ArrayType * construct_empty_array(Oid elmtype)
void heap_freetuple(HeapTuple htup)
DestReceiver * None_Receiver
void(* callback)(void *arg)
struct ErrorContextCallback * previous
#define OidIsValid(objectId)
Oid get_func_rettype(Oid funcid)
ErrorContextCallback * error_context_stack
static Oid lookup_fdw_validator_func(DefElem *validator)
FdwRoutine * GetFdwRoutine(Oid fdwhandler)
void changeDependencyOnOwner(Oid classId, Oid objectId, Oid newOwnerId)
void aclcheck_error(AclResult aclerr, ObjectType objtype, const char *objectname)
ForeignDataWrapper * GetForeignDataWrapper(Oid fdwid)
static Oid lookup_fdw_handler_func(DefElem *handler)
#define ObjectIdGetDatum(X)
char * defGetString(DefElem *def)
List * pg_parse_query(const char *query_string)
Oid LookupFuncName(List *funcname, int nargs, const Oid *argtypes, bool missing_ok)
ObjectAddress AlterForeignDataWrapperOwner(const char *name, Oid newOwnerId)
#define lfirst_node(type, lc)
Oid RemoveUserMapping(DropUserMappingStmt *stmt)
AclResult pg_foreign_server_aclcheck(Oid srv_oid, Oid roleid, AclMode mode)
ObjectAddress CreateUserMapping(CreateUserMappingStmt *stmt)
bool IsImportableForeignTable(const char *tablename, ImportForeignSchemaStmt *stmt)
#define CStringGetDatum(X)
void performDeletion(const ObjectAddress *object, DropBehavior behavior, int flags)
MemoryContext CurrentMemoryContext
ForeignServer * GetForeignServerByName(const char *srvname, bool missing_ok)
ImportForeignSchema_function ImportForeignSchema
ObjectAddress AlterUserMapping(AlterUserMappingStmt *stmt)
void check_is_member_of_role(Oid member, Oid role)
Datum makeArrayResult(ArrayBuildState *astate, MemoryContext rcontext)
#define InvokeObjectPostAlterHook(classId, objectId, subId)
bool superuser_arg(Oid roleid)
List * lappend(List *list, void *datum)
#define heap_getattr(tup, attnum, tupleDesc, isnull)
ObjectAddress CreateForeignServer(CreateForeignServerStmt *stmt)
char * NameListToString(List *names)
void CommandCounterIncrement(void)
Datum SysCacheGetAttr(int cacheId, HeapTuple tup, AttrNumber attributeNumber, bool *isNull)
Oid get_rolespec_oid(const RoleSpec *role, bool missing_ok)
List * untransformRelOptions(Datum options)
long deleteDependencyRecordsForClass(Oid classId, Oid objectId, Oid refclassId, char deptype)
List * list_delete_cell(List *list, ListCell *cell)
FormData_pg_foreign_server * Form_pg_foreign_server
#define ereport(elevel,...)
int internalerrquery(const char *query)
#define HeapTupleIsValid(tuple)
ObjectAddress AlterForeignServerOwner(const char *name, Oid newOwnerId)
FormData_pg_foreign_data_wrapper * Form_pg_foreign_data_wrapper
ForeignDataWrapper * GetForeignDataWrapperByName(const char *fdwname, bool missing_ok)
void recordDependencyOnCurrentExtension(const ObjectAddress *object, bool isReplace)
#define GetSysCacheOid2(cacheId, oidcol, key1, key2)
void CatalogTupleUpdate(Relation heapRel, ItemPointer otid, HeapTuple tup)
ObjectAddress AlterForeignDataWrapper(AlterFdwStmt *stmt)
static void AlterForeignServerOwner_internal(Relation rel, HeapTuple tup, Oid newOwnerId)
#define ObjectAddressSet(addr, class_id, object_id)
#define DatumGetPointer(X)
static Datum values[MAXATTR]
ArrayBuildState * accumArrayResult(ArrayBuildState *astate, Datum dvalue, bool disnull, Oid element_type, MemoryContext rcontext)
#define SearchSysCacheCopy1(cacheId, key1)
#define OidFunctionCall2(functionId, arg1, arg2)
const ObjectAddress InvalidObjectAddress
void ImportForeignSchema(ImportForeignSchemaStmt *stmt)
int errmsg(const char *fmt,...)
#define CStringGetTextDatum(s)
static void AlterForeignDataWrapperOwner_internal(Relation rel, HeapTuple tup, Oid newOwnerId)
#define SET_VARSIZE(PTR, len)
Relation table_open(Oid relationId, LOCKMODE lockmode)
HeapTuple heap_modify_tuple(HeapTuple tuple, TupleDesc tupleDesc, Datum *replValues, bool *replIsnull, bool *doReplace)
#define ERRCODE_DUPLICATE_OBJECT
#define PointerIsValid(pointer)
#define UserMappingOidIndexId
Acl * aclnewowner(const Acl *old_acl, Oid oldOwnerId, Oid newOwnerId)
void ProcessUtility(PlannedStmt *pstmt, const char *queryString, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment *queryEnv, DestReceiver *dest, QueryCompletion *qc)
void CatalogTupleInsert(Relation heapRel, HeapTuple tup)
#define MappingUserName(userid)
int errposition(int cursorpos)
static Datum optionListToArray(List *options)
static void import_error_callback(void *arg)
int internalerrposition(int cursorpos)