83 if (strchr(
name,
'=') != NULL)
85 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
86 errmsg(
"invalid option name \"%s\": must not contain \"=\"",
139 foreach(cell, resultOptions)
158 (
errcode(ERRCODE_UNDEFINED_OBJECT),
159 errmsg(
"option \"%s\" not found",
167 (
errcode(ERRCODE_UNDEFINED_OBJECT),
168 errmsg(
"option \"%s\" not found",
178 errmsg(
"option \"%s\" provided more than once",
180 resultOptions =
lappend(resultOptions, od);
184 elog(
ERROR,
"unrecognized action %d on option \"%s\"",
194 Datum valarg = result;
219 Datum repl_val[Natts_pg_foreign_data_wrapper];
220 bool repl_null[Natts_pg_foreign_data_wrapper];
221 bool repl_repl[Natts_pg_foreign_data_wrapper];
231 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
232 errmsg(
"permission denied to change owner of foreign-data wrapper \"%s\"",
234 errhint(
"Must be superuser to change owner of a foreign-data wrapper.")));
239 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
240 errmsg(
"permission denied to change owner of foreign-data wrapper \"%s\"",
242 errhint(
"The owner of a foreign-data wrapper must be a superuser.")));
244 if (form->fdwowner != newOwnerId)
246 memset(repl_null,
false,
sizeof(repl_null));
247 memset(repl_repl,
false,
sizeof(repl_repl));
249 repl_repl[Anum_pg_foreign_data_wrapper_fdwowner - 1] =
true;
250 repl_val[Anum_pg_foreign_data_wrapper_fdwowner - 1] =
ObjectIdGetDatum(newOwnerId);
253 Anum_pg_foreign_data_wrapper_fdwacl,
260 form->fdwowner, newOwnerId);
261 repl_repl[Anum_pg_foreign_data_wrapper_fdwacl - 1] =
true;
262 repl_val[Anum_pg_foreign_data_wrapper_fdwacl - 1] =
PointerGetDatum(newAcl);
301 (
errcode(ERRCODE_UNDEFINED_OBJECT),
302 errmsg(
"foreign-data wrapper \"%s\" does not exist",
name)));
335 (
errcode(ERRCODE_UNDEFINED_OBJECT),
336 errmsg(
"foreign-data wrapper with OID %u does not exist", fwdId)));
352 Datum repl_val[Natts_pg_foreign_server];
353 bool repl_null[Natts_pg_foreign_server];
354 bool repl_repl[Natts_pg_foreign_server];
361 if (form->srvowner != newOwnerId)
389 memset(repl_null,
false,
sizeof(repl_null));
390 memset(repl_repl,
false,
sizeof(repl_repl));
392 repl_repl[Anum_pg_foreign_server_srvowner - 1] =
true;
393 repl_val[Anum_pg_foreign_server_srvowner - 1] =
ObjectIdGetDatum(newOwnerId);
396 Anum_pg_foreign_server_srvacl,
403 form->srvowner, newOwnerId);
404 repl_repl[Anum_pg_foreign_server_srvacl - 1] =
true;
440 (
errcode(ERRCODE_UNDEFINED_OBJECT),
441 errmsg(
"server \"%s\" does not exist",
name)));
472 (
errcode(ERRCODE_UNDEFINED_OBJECT),
473 errmsg(
"foreign server with OID %u does not exist", srvId)));
490 if (handler == NULL || handler->
arg == NULL)
499 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
500 errmsg(
"function %s must return type %s",
514 if (validator == NULL || validator->
arg == NULL)
518 funcargtypes[0] = TEXTARRAYOID;
519 funcargtypes[1] = OIDOID;
530 bool *handler_given,
Oid *fdwhandler,
531 bool *validator_given,
Oid *fdwvalidator)
535 *handler_given =
false;
536 *validator_given =
false;
541 foreach(cell, func_options)
545 if (strcmp(def->
defname,
"handler") == 0)
549 *handler_given =
true;
552 else if (strcmp(def->
defname,
"validator") == 0)
554 if (*validator_given)
556 *validator_given =
true;
560 elog(
ERROR,
"option \"%s\" not recognized",
573 bool nulls[Natts_pg_foreign_data_wrapper];
577 bool validator_given;
590 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
591 errmsg(
"permission denied to create foreign-data wrapper \"%s\"",
593 errhint(
"Must be superuser to create a foreign-data wrapper.")));
604 errmsg(
"foreign-data wrapper \"%s\" already exists",
611 memset(nulls,
false,
sizeof(nulls));
614 Anum_pg_foreign_data_wrapper_oid);
616 values[Anum_pg_foreign_data_wrapper_fdwname - 1] =
622 &handler_given, &fdwhandler,
623 &validator_given, &fdwvalidator);
628 nulls[Anum_pg_foreign_data_wrapper_fdwacl - 1] =
true;
636 values[Anum_pg_foreign_data_wrapper_fdwoptions - 1] = fdwoptions;
638 nulls[Anum_pg_foreign_data_wrapper_fdwoptions - 1] =
true;
647 myself.
classId = ForeignDataWrapperRelationId;
653 referenced.
classId = ProcedureRelationId;
661 referenced.
classId = ProcedureRelationId;
690 Datum repl_val[Natts_pg_foreign_data_wrapper];
691 bool repl_null[Natts_pg_foreign_data_wrapper];
692 bool repl_repl[Natts_pg_foreign_data_wrapper];
697 bool validator_given;
707 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
708 errmsg(
"permission denied to alter foreign-data wrapper \"%s\"",
710 errhint(
"Must be superuser to alter a foreign-data wrapper.")));
717 (
errcode(ERRCODE_UNDEFINED_OBJECT),
718 errmsg(
"foreign-data wrapper \"%s\" does not exist",
stmt->fdwname)));
721 fdwId = fdwForm->oid;
723 memset(repl_val, 0,
sizeof(repl_val));
724 memset(repl_null,
false,
sizeof(repl_null));
725 memset(repl_repl,
false,
sizeof(repl_repl));
728 &handler_given, &fdwhandler,
729 &validator_given, &fdwvalidator);
733 repl_val[Anum_pg_foreign_data_wrapper_fdwhandler - 1] =
ObjectIdGetDatum(fdwhandler);
734 repl_repl[Anum_pg_foreign_data_wrapper_fdwhandler - 1] =
true;
741 (
errmsg(
"changing the foreign-data wrapper handler can change behavior of existing foreign tables")));
746 repl_val[Anum_pg_foreign_data_wrapper_fdwvalidator - 1] =
ObjectIdGetDatum(fdwvalidator);
747 repl_repl[Anum_pg_foreign_data_wrapper_fdwvalidator - 1] =
true;
756 (
errmsg(
"changing the foreign-data wrapper validator can cause "
757 "the options for dependent objects to become invalid")));
764 fdwvalidator = fdwForm->fdwvalidator;
775 Anum_pg_foreign_data_wrapper_fdwoptions,
787 repl_val[Anum_pg_foreign_data_wrapper_fdwoptions - 1] = datum;
789 repl_null[Anum_pg_foreign_data_wrapper_fdwoptions - 1] =
true;
791 repl_repl[Anum_pg_foreign_data_wrapper_fdwoptions - 1] =
true;
796 repl_val, repl_null, repl_repl);
805 if (handler_given || validator_given)
822 referenced.
classId = ProcedureRelationId;
830 referenced.
classId = ProcedureRelationId;
854 bool nulls[Natts_pg_foreign_server];
875 if (
stmt->if_not_exists)
887 errmsg(
"server \"%s\" already exists, skipping",
895 errmsg(
"server \"%s\" already exists",
913 memset(nulls,
false,
sizeof(nulls));
916 Anum_pg_foreign_server_oid);
918 values[Anum_pg_foreign_server_srvname - 1] =
924 if (
stmt->servertype)
925 values[Anum_pg_foreign_server_srvtype - 1] =
928 nulls[Anum_pg_foreign_server_srvtype - 1] =
true;
932 values[Anum_pg_foreign_server_srvversion - 1] =
935 nulls[Anum_pg_foreign_server_srvversion - 1] =
true;
938 nulls[Anum_pg_foreign_server_srvacl - 1] =
true;
947 values[Anum_pg_foreign_server_srvoptions - 1] = srvoptions;
949 nulls[Anum_pg_foreign_server_srvoptions - 1] =
true;
958 myself.
classId = ForeignServerRelationId;
962 referenced.
classId = ForeignDataWrapperRelationId;
989 Datum repl_val[Natts_pg_foreign_server];
990 bool repl_null[Natts_pg_foreign_server];
991 bool repl_repl[Natts_pg_foreign_server];
1003 (
errcode(ERRCODE_UNDEFINED_OBJECT),
1004 errmsg(
"server \"%s\" does not exist",
stmt->servername)));
1007 srvId = srvForm->oid;
1016 memset(repl_val, 0,
sizeof(repl_val));
1017 memset(repl_null,
false,
sizeof(repl_null));
1018 memset(repl_repl,
false,
sizeof(repl_repl));
1020 if (
stmt->has_version)
1026 repl_val[Anum_pg_foreign_server_srvversion - 1] =
1029 repl_null[Anum_pg_foreign_server_srvversion - 1] =
true;
1031 repl_repl[Anum_pg_foreign_server_srvversion - 1] =
true;
1043 Anum_pg_foreign_server_srvoptions,
1055 repl_val[Anum_pg_foreign_server_srvoptions - 1] = datum;
1057 repl_null[Anum_pg_foreign_server_srvoptions - 1] =
true;
1059 repl_repl[Anum_pg_foreign_server_srvoptions - 1] =
true;
1064 repl_val, repl_null, repl_repl);
1092 if (umuserid == curuserid)
1116 bool nulls[Natts_pg_user_mapping];
1141 umId =
GetSysCacheOid2(USERMAPPINGUSERSERVER, Anum_pg_user_mapping_oid,
1147 if (
stmt->if_not_exists)
1155 errmsg(
"user mapping for \"%s\" already exists for server \"%s\", skipping",
1157 stmt->servername)));
1165 errmsg(
"user mapping for \"%s\" already exists for server \"%s\"",
1167 stmt->servername)));
1176 memset(nulls,
false,
sizeof(nulls));
1179 Anum_pg_user_mapping_oid);
1191 values[Anum_pg_user_mapping_umoptions - 1] = useoptions;
1193 nulls[Anum_pg_user_mapping_umoptions - 1] =
true;
1202 myself.
classId = UserMappingRelationId;
1206 referenced.
classId = ForeignServerRelationId;
1241 Datum repl_val[Natts_pg_user_mapping];
1242 bool repl_null[Natts_pg_user_mapping];
1243 bool repl_repl[Natts_pg_user_mapping];
1259 umId =
GetSysCacheOid2(USERMAPPINGUSERSERVER, Anum_pg_user_mapping_oid,
1264 (
errcode(ERRCODE_UNDEFINED_OBJECT),
1265 errmsg(
"user mapping for \"%s\" does not exist for server \"%s\"",
1273 elog(
ERROR,
"cache lookup failed for user mapping %u", umId);
1275 memset(repl_val, 0,
sizeof(repl_val));
1276 memset(repl_null,
false,
sizeof(repl_null));
1277 memset(repl_repl,
false,
sizeof(repl_repl));
1293 Anum_pg_user_mapping_umoptions,
1305 repl_val[Anum_pg_user_mapping_umoptions - 1] = datum;
1307 repl_null[Anum_pg_user_mapping_umoptions - 1] =
true;
1309 repl_repl[Anum_pg_user_mapping_umoptions - 1] =
true;
1314 repl_val, repl_null, repl_repl);
1354 elog(
NOTICE,
"role \"%s\" does not exist, skipping",
1364 if (!
stmt->missing_ok)
1366 (
errcode(ERRCODE_UNDEFINED_OBJECT),
1367 errmsg(
"server \"%s\" does not exist",
1368 stmt->servername)));
1371 (
errmsg(
"server \"%s\" does not exist, skipping",
1372 stmt->servername)));
1376 umId =
GetSysCacheOid2(USERMAPPINGUSERSERVER, Anum_pg_user_mapping_oid,
1382 if (!
stmt->missing_ok)
1384 (
errcode(ERRCODE_UNDEFINED_OBJECT),
1385 errmsg(
"user mapping for \"%s\" does not exist for server \"%s\"",
1390 (
errmsg(
"user mapping for \"%s\" does not exist for server \"%s\", skipping",
1400 object.classId = UserMappingRelationId;
1401 object.objectId = umId;
1402 object.objectSubId = 0;
1420 bool nulls[Natts_pg_foreign_table];
1457 memset(nulls,
false,
sizeof(nulls));
1468 values[Anum_pg_foreign_table_ftoptions - 1] = ftoptions;
1470 nulls[Anum_pg_foreign_table_ftoptions - 1] =
true;
1479 myself.
classId = RelationRelationId;
1483 referenced.
classId = ForeignServerRelationId;
1517 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
1518 errmsg(
"foreign-data wrapper \"%s\" has no handler",
1523 (
errcode(ERRCODE_FDW_NO_SCHEMAS),
1524 errmsg(
"foreign-data wrapper \"%s\" does not support IMPORT FOREIGN SCHEMA",
1531 foreach(lc, cmd_list)
1533 char *cmd = (
char *)
lfirst(lc);
1536 List *raw_parsetree_list;
1544 callback_arg.
cmd = cmd;
1546 sqlerrcontext.
arg = &callback_arg;
1559 foreach(lc2, raw_parsetree_list)
1571 "foreign-data wrapper \"%s\" returned incorrect statement type %d",
1587 pstmt->canSetTag =
false;
1588 pstmt->utilityStmt = (
Node *) cstmt;
1615 int syntaxerrposition;
1619 if (syntaxerrposition > 0)
Acl * aclnewowner(const Acl *old_acl, Oid oldOwnerId, Oid newOwnerId)
void check_can_set_role(Oid member, Oid role)
Oid get_rolespec_oid(const RoleSpec *role, bool missing_ok)
void aclcheck_error(AclResult aclerr, ObjectType objtype, const char *objectname)
AclResult object_aclcheck(Oid classid, Oid objectid, Oid roleid, AclMode mode)
bool object_ownercheck(Oid classid, Oid objectid, Oid roleid)
ArrayBuildState * accumArrayResult(ArrayBuildState *astate, Datum dvalue, bool disnull, Oid element_type, MemoryContext rcontext)
ArrayType * construct_empty_array(Oid elmtype)
Datum makeArrayResult(ArrayBuildState *astate, MemoryContext rcontext)
static Datum values[MAXATTR]
#define CStringGetTextDatum(s)
#define OidIsValid(objectId)
Oid GetNewOidWithIndex(Relation relation, Oid indexId, AttrNumber oidcolumn)
char * defGetString(DefElem *def)
void errorConflictingDefElem(DefElem *defel, ParseState *pstate)
void performDeletion(const ObjectAddress *object, DropBehavior behavior, int flags)
DestReceiver * None_Receiver
int internalerrquery(const char *query)
int internalerrposition(int cursorpos)
ErrorContextCallback * error_context_stack
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
int errposition(int cursorpos)
#define ereport(elevel,...)
#define DirectFunctionCall1(func, arg1)
#define OidFunctionCall2(functionId, arg1, arg2)
ForeignDataWrapper * GetForeignDataWrapper(Oid fdwid)
ForeignServer * GetForeignServerByName(const char *srvname, bool missing_ok)
Oid get_foreign_server_oid(const char *servername, bool missing_ok)
ForeignDataWrapper * GetForeignDataWrapperByName(const char *fdwname, bool missing_ok)
bool IsImportableForeignTable(const char *tablename, ImportForeignSchemaStmt *stmt)
FdwRoutine * GetFdwRoutine(Oid fdwhandler)
#define MappingUserName(userid)
static void AlterForeignServerOwner_internal(Relation rel, HeapTuple tup, Oid newOwnerId)
static Oid lookup_fdw_handler_func(DefElem *handler)
ObjectAddress AlterForeignServerOwner(const char *name, Oid newOwnerId)
static void import_error_callback(void *arg)
void AlterForeignServerOwner_oid(Oid srvId, Oid newOwnerId)
void ImportForeignSchema(ImportForeignSchemaStmt *stmt)
ObjectAddress AlterForeignDataWrapperOwner(const char *name, Oid newOwnerId)
ObjectAddress AlterForeignServer(AlterForeignServerStmt *stmt)
static Datum optionListToArray(List *options)
static void AlterForeignDataWrapperOwner_internal(Relation rel, HeapTuple tup, Oid newOwnerId)
static Oid lookup_fdw_validator_func(DefElem *validator)
void AlterForeignDataWrapperOwner_oid(Oid fwdId, Oid newOwnerId)
static void user_mapping_ddl_aclcheck(Oid umuserid, Oid serverid, const char *servername)
ObjectAddress AlterForeignDataWrapper(ParseState *pstate, AlterFdwStmt *stmt)
ObjectAddress CreateForeignServer(CreateForeignServerStmt *stmt)
Oid RemoveUserMapping(DropUserMappingStmt *stmt)
ObjectAddress CreateForeignDataWrapper(ParseState *pstate, CreateFdwStmt *stmt)
static void parse_func_options(ParseState *pstate, List *func_options, bool *handler_given, Oid *fdwhandler, bool *validator_given, Oid *fdwvalidator)
ObjectAddress AlterUserMapping(AlterUserMappingStmt *stmt)
void CreateForeignTable(CreateForeignTableStmt *stmt, Oid relid)
Datum transformGenericOptions(Oid catalogId, Datum oldOptions, List *options, Oid fdwvalidator)
ObjectAddress CreateUserMapping(CreateUserMappingStmt *stmt)
HeapTuple heap_modify_tuple(HeapTuple tuple, TupleDesc tupleDesc, const Datum *replValues, const bool *replIsnull, const bool *doReplace)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull)
void heap_freetuple(HeapTuple htup)
#define HeapTupleIsValid(tuple)
static Datum heap_getattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
static void * GETSTRUCT(const HeapTupleData *tuple)
void CatalogTupleUpdate(Relation heapRel, ItemPointer otid, HeapTuple tup)
void CatalogTupleInsert(Relation heapRel, HeapTuple tup)
if(TABLE==NULL||TABLE_index==NULL)
List * lappend(List *list, void *datum)
List * list_delete_cell(List *list, ListCell *cell)
Oid get_func_rettype(Oid funcid)
char * pstrdup(const char *in)
MemoryContext CurrentMemoryContext
Datum namein(PG_FUNCTION_ARGS)
char * NameListToString(const List *names)
Oid LookupCreationNamespace(const char *nspname)
#define IsA(nodeptr, _type_)
#define InvokeObjectPostCreateHook(classId, objectId, subId)
#define InvokeObjectPostAlterHook(classId, objectId, subId)
const ObjectAddress InvalidObjectAddress
#define ObjectAddressSet(addr, class_id, object_id)
Oid LookupFuncName(List *funcname, int nargs, const Oid *argtypes, bool missing_ok)
void checkMembershipInCurrentExtension(const ObjectAddress *object)
void recordDependencyOn(const ObjectAddress *depender, const ObjectAddress *referenced, DependencyType behavior)
long deleteDependencyRecordsForClass(Oid classId, Oid objectId, Oid refclassId, char deptype)
void recordDependencyOnCurrentExtension(const ObjectAddress *object, bool isReplace)
FormData_pg_foreign_data_wrapper * Form_pg_foreign_data_wrapper
FormData_pg_foreign_server * Form_pg_foreign_server
#define lfirst_node(type, lc)
void changeDependencyOnOwner(Oid classId, Oid objectId, Oid newOwnerId)
void recordDependencyOnOwner(Oid classId, Oid objectId, Oid owner)
List * pg_parse_query(const char *query_string)
static Datum PointerGetDatum(const void *X)
static Datum ObjectIdGetDatum(Oid X)
static Pointer DatumGetPointer(Datum X)
static Datum CStringGetDatum(const char *X)
#define RelationGetDescr(relation)
List * untransformRelOptions(Datum options)
#define ERRCODE_DUPLICATE_OBJECT
struct ErrorContextCallback * previous
void(* callback)(void *arg)
ImportForeignSchema_function ImportForeignSchema
bool superuser_arg(Oid roleid)
Datum SysCacheGetAttr(int cacheId, HeapTuple tup, AttrNumber attributeNumber, bool *isNull)
#define SearchSysCacheCopy1(cacheId, key1)
#define GetSysCacheOid2(cacheId, oidcol, key1, key2)
void table_close(Relation relation, LOCKMODE lockmode)
Relation table_open(Oid relationId, LOCKMODE lockmode)
void ProcessUtility(PlannedStmt *pstmt, const char *queryString, bool readOnlyTree, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment *queryEnv, DestReceiver *dest, QueryCompletion *qc)
@ PROCESS_UTILITY_SUBCOMMAND
static char * VARDATA(const void *PTR)
static void SET_VARSIZE(void *PTR, Size len)
void CommandCounterIncrement(void)