@ -707,31 +707,31 @@ const ObjectAddress InvalidObjectAddress =
} ;
static ObjectAddress get_object_address_unqualified ( ObjectType objtype ,
List * qualname , bool missing_ok ) ;
Value * strval , bool missing_ok ) ;
static ObjectAddress get_relation_by_qualified_name ( ObjectType objtype ,
List * objnam e , Relation * relp ,
List * object , Relation * relp ,
LOCKMODE lockmode , bool missing_ok ) ;
static ObjectAddress get_object_address_relobject ( ObjectType objtype ,
List * objnam e , Relation * relp , bool missing_ok ) ;
List * object , Relation * relp , bool missing_ok ) ;
static ObjectAddress get_object_address_attribute ( ObjectType objtype ,
List * objnam e , Relation * relp ,
List * object , Relation * relp ,
LOCKMODE lockmode , bool missing_ok ) ;
static ObjectAddress get_object_address_attrdef ( ObjectType objtype ,
List * objnam e , Relation * relp , LOCKMODE lockmode ,
List * object , Relation * relp , LOCKMODE lockmode ,
bool missing_ok ) ;
static ObjectAddress get_object_address_type ( ObjectType objtype ,
ListCell * typecell , bool missing_ok ) ;
static ObjectAddress get_object_address_opcf ( ObjectType objtype , List * objnam e ,
TypeName * typename , bool missing_ok ) ;
static ObjectAddress get_object_address_opcf ( ObjectType objtype , List * object ,
bool missing_ok ) ;
static ObjectAddress get_object_address_opf_member ( ObjectType objtype ,
List * objnam e , Lis t * objargs , bool missing_ok ) ;
List * objec t , bool missing_ok ) ;
static ObjectAddress get_object_address_usermapping ( List * objnam e ,
List * objargs , bool missing_ok ) ;
static ObjectAddress get_object_address_publication_rel ( List * objnam e ,
List * objargs , Relation * relp ,
static ObjectAddress get_object_address_usermapping ( List * object ,
bool missing_ok ) ;
static ObjectAddress get_object_address_publication_rel ( List * object ,
Relation * relp ,
bool missing_ok ) ;
static ObjectAddress get_object_address_defacl ( List * objnam e , Lis t * objargs ,
static ObjectAddress get_object_address_defacl ( List * objec t ,
bool missing_ok ) ;
static const ObjectPropertyType * get_object_property_data ( Oid class_id ) ;
@ -741,8 +741,8 @@ static void getRelationTypeDescription(StringInfo buffer, Oid relid,
int32 objectSubId ) ;
static void getProcedureTypeDescription ( StringInfo buffer , Oid procid ) ;
static void getConstraintTypeDescription ( StringInfo buffer , Oid constroid ) ;
static void getOpFamilyIdentity ( StringInfo buffer , Oid opfid , List * * objnam e ) ;
static void getRelationIdentity ( StringInfo buffer , Oid relid , List * * objnam e ) ;
static void getOpFamilyIdentity ( StringInfo buffer , Oid opfid , List * * object ) ;
static void getRelationIdentity ( StringInfo buffer , Oid relid , List * * object ) ;
/*
* Translate an object name and arguments ( as passed by the parser ) to an
@ -776,7 +776,7 @@ static void getRelationIdentity(StringInfo buffer, Oid relid, List **objname);
* better to add some support for that in this function .
*/
ObjectAddress
get_object_address ( ObjectType objtype , List * objnam e , Lis t * objargs ,
get_object_address ( ObjectType objtype , Node * objec t ,
Relation * relp , LOCKMODE lockmode , bool missing_ok )
{
ObjectAddress address ;
@ -806,19 +806,19 @@ get_object_address(ObjectType objtype, List *objname, List *objargs,
case OBJECT_MATVIEW :
case OBJECT_FOREIGN_TABLE :
address =
get_relation_by_qualified_name ( objtype , objname ,
get_relation_by_qualified_name ( objtype , castNode ( List , object ) ,
& relation , lockmode ,
missing_ok ) ;
break ;
case OBJECT_COLUMN :
address =
get_object_address_attribute ( objtype , objname ,
get_object_address_attribute ( objtype , castNode ( List , object ) ,
& relation , lockmode ,
missing_ok ) ;
break ;
case OBJECT_DEFAULT :
address =
get_object_address_attrdef ( objtype , objname ,
get_object_address_attrdef ( objtype , castNode ( List , object ) ,
& relation , lockmode ,
missing_ok ) ;
break ;
@ -826,17 +826,20 @@ get_object_address(ObjectType objtype, List *objname, List *objargs,
case OBJECT_TRIGGER :
case OBJECT_TABCONSTRAINT :
case OBJECT_POLICY :
address = get_object_address_relobject ( objtype , objname ,
address = get_object_address_relobject ( objtype , castNode ( List , object ) ,
& relation , missing_ok ) ;
break ;
case OBJECT_DOMCONSTRAINT :
{
List * objlist ;
ObjectAddress domaddr ;
char * constrname ;
objlist = castNode ( List , object ) ;
domaddr = get_object_address_type ( OBJECT_DOMAIN ,
list_head ( objname ) , missing_ok ) ;
constrname = strVal ( linitial ( objargs ) ) ;
castNode ( TypeName , linitial ( objlist ) ) ,
missing_ok ) ;
constrname = strVal ( lsecond ( objlist ) ) ;
address . classId = ConstraintRelationId ;
address . objectId = get_domain_constraint_oid ( domaddr . objectId ,
@ -858,57 +861,64 @@ get_object_address(ObjectType objtype, List *objname, List *objargs,
case OBJECT_PUBLICATION :
case OBJECT_SUBSCRIPTION :
address = get_object_address_unqualified ( objtype ,
objname , missing_ok ) ;
( Value * ) object , missing_ok ) ;
break ;
case OBJECT_TYPE :
case OBJECT_DOMAIN :
address = get_object_address_type ( objtype , list_head ( objname ) , missing_ok ) ;
address = get_object_address_type ( objtype , castNode ( TypeName , object ) , missing_ok ) ;
break ;
case OBJECT_AGGREGATE :
address . classId = ProcedureRelationId ;
address . objectId =
LookupAggNameTypeNames ( objname , objargs , missing_ok ) ;
address . objectSubId = 0 ;
break ;
{
ObjectWithArgs * owa = castNode ( ObjectWithArgs , object ) ;
address . classId = ProcedureRelationId ;
address . objectId =
LookupAggNameTypeNames ( owa - > objname , owa - > objargs , missing_ok ) ;
address . objectSubId = 0 ;
break ;
}
case OBJECT_FUNCTION :
address . classId = ProcedureRelationId ;
address . objectId =
LookupFuncNameTypeNames ( objname , objargs , missing_ok ) ;
address . objectSubId = 0 ;
break ;
{
ObjectWithArgs * owa = castNode ( ObjectWithArgs , object ) ;
address . classId = ProcedureRelationId ;
address . objectId =
LookupFuncNameTypeNames ( owa - > objname , owa - > objargs , missing_ok ) ;
address . objectSubId = 0 ;
break ;
}
case OBJECT_OPERATOR :
Assert ( list_length ( objargs ) = = 2 ) ;
address . classId = OperatorRelationId ;
address . objectId =
LookupOperNameTypeNames ( NULL , objname ,
( TypeName * ) linitial ( objargs ) ,
( TypeName * ) lsecond ( objargs ) ,
missing_ok , - 1 ) ;
address . objectSubId = 0 ;
break ;
{
ObjectWithArgs * owa = castNode ( ObjectWithArgs , object ) ;
address . classId = OperatorRelationId ;
Assert ( list_length ( owa - > objargs ) = = 2 ) ;
address . objectId =
LookupOperNameTypeNames ( NULL , owa - > objname ,
castNode ( TypeName , linitial ( owa - > objargs ) ) ,
castNode ( TypeName , lsecond ( owa - > objargs ) ) ,
missing_ok , - 1 ) ;
address . objectSubId = 0 ;
break ;
}
case OBJECT_COLLATION :
address . classId = CollationRelationId ;
address . objectId = get_collation_oid ( objname , missing_ok ) ;
address . objectId = get_collation_oid ( castNode ( List , object ) , missing_ok ) ;
address . objectSubId = 0 ;
break ;
case OBJECT_CONVERSION :
address . classId = ConversionRelationId ;
address . objectId = get_conversion_oid ( objname , missing_ok ) ;
address . objectId = get_conversion_oid ( castNode ( List , object ) , missing_ok ) ;
address . objectSubId = 0 ;
break ;
case OBJECT_OPCLASS :
case OBJECT_OPFAMILY :
address = get_object_address_opcf ( objtype , objname , missing_ok ) ;
address = get_object_address_opcf ( objtype , castNode ( List , object ) , missing_ok ) ;
break ;
case OBJECT_AMOP :
case OBJECT_AMPROC :
address = get_object_address_opf_member ( objtype , objname ,
objargs , missing_ok ) ;
address = get_object_address_opf_member ( objtype , castNode ( List , object ) , missing_ok ) ;
break ;
case OBJECT_LARGEOBJECT :
Assert ( list_length ( objname ) = = 1 ) ;
address . classId = LargeObjectRelationId ;
address . objectId = oidparse ( linitial ( objname ) ) ;
address . objectId = oidparse ( object ) ;
address . objectSubId = 0 ;
if ( ! LargeObjectExists ( address . objectId ) )
{
@ -921,8 +931,8 @@ get_object_address(ObjectType objtype, List *objname, List *objargs,
break ;
case OBJECT_CAST :
{
TypeName * sourcetype = ( TypeName * ) linitial ( objname ) ;
TypeName * targettype = ( TypeName * ) linitial ( objargs ) ;
TypeName * sourcetype = castNode ( TypeName , linitial ( castNode ( List , object ) ) ) ;
TypeName * targettype = castNode ( TypeName , lsecond ( castNode ( List , object ) ) ) ;
Oid sourcetypeid ;
Oid targettypeid ;
@ -936,8 +946,8 @@ get_object_address(ObjectType objtype, List *objname, List *objargs,
break ;
case OBJECT_TRANSFORM :
{
TypeName * typename = ( TypeName * ) linitial ( objname ) ;
char * langname = strVal ( linitial ( objargs ) ) ;
TypeName * typename = castNode ( TypeName , linitial ( castNode ( List , object ) ) ) ;
char * langname = strVal ( lsecond ( castNode ( List , object ) ) ) ;
Oid type_id = LookupTypeNameOid ( NULL , typename , missing_ok ) ;
Oid lang_id = get_language_oid ( langname , missing_ok ) ;
@ -949,35 +959,35 @@ get_object_address(ObjectType objtype, List *objname, List *objargs,
break ;
case OBJECT_TSPARSER :
address . classId = TSParserRelationId ;
address . objectId = get_ts_parser_oid ( objname , missing_ok ) ;
address . objectId = get_ts_parser_oid ( castNode ( List , object ) , missing_ok ) ;
address . objectSubId = 0 ;
break ;
case OBJECT_TSDICTIONARY :
address . classId = TSDictionaryRelationId ;
address . objectId = get_ts_dict_oid ( objname , missing_ok ) ;
address . objectId = get_ts_dict_oid ( castNode ( List , object ) , missing_ok ) ;
address . objectSubId = 0 ;
break ;
case OBJECT_TSTEMPLATE :
address . classId = TSTemplateRelationId ;
address . objectId = get_ts_template_oid ( objname , missing_ok ) ;
address . objectId = get_ts_template_oid ( castNode ( List , object ) , missing_ok ) ;
address . objectSubId = 0 ;
break ;
case OBJECT_TSCONFIGURATION :
address . classId = TSConfigRelationId ;
address . objectId = get_ts_config_oid ( objname , missing_ok ) ;
address . objectId = get_ts_config_oid ( castNode ( List , object ) , missing_ok ) ;
address . objectSubId = 0 ;
break ;
case OBJECT_USER_MAPPING :
address = get_object_address_usermapping ( objname , objargs ,
address = get_object_address_usermapping ( castNode ( List , object ) ,
missing_ok ) ;
break ;
case OBJECT_PUBLICATION_REL :
address = get_object_address_publication_rel ( objname , objargs ,
address = get_object_address_publication_rel ( castNode ( List , object ) ,
& relation ,
missing_ok ) ;
break ;
case OBJECT_DEFACL :
address = get_object_address_defacl ( objname , objargs ,
address = get_object_address_defacl ( castNode ( List , object ) ,
missing_ok ) ;
break ;
default :
@ -1068,25 +1078,25 @@ get_object_address(ObjectType objtype, List *objname, List *objargs,
/*
* Return an ObjectAddress based on a RangeVar and an object name . The
* name of the relation identified by the RangeVar is prepended to the
* ( possibly empty ) list passed in as objnam e . This is useful to find
* ( possibly empty ) list passed in as object . This is useful to find
* the ObjectAddress of objects that depend on a relation . All other
* considerations are exactly as for get_object_address above .
*/
ObjectAddress
get_object_address_rv ( ObjectType objtype , RangeVar * rel , List * objnam e ,
List * objargs , Relation * relp , LOCKMODE lockmode ,
get_object_address_rv ( ObjectType objtype , RangeVar * rel , List * object ,
Relation * relp , LOCKMODE lockmode ,
bool missing_ok )
{
if ( rel )
{
objnam e = lcons ( makeString ( rel - > relname ) , objnam e ) ;
object = lcons ( makeString ( rel - > relname ) , object ) ;
if ( rel - > schemaname )
objnam e = lcons ( makeString ( rel - > schemaname ) , objnam e ) ;
object = lcons ( makeString ( rel - > schemaname ) , object ) ;
if ( rel - > catalogname )
objnam e = lcons ( makeString ( rel - > catalogname ) , objnam e ) ;
object = lcons ( makeString ( rel - > catalogname ) , object ) ;
}
return get_object_address ( objtype , objname , objargs ,
return get_object_address ( objtype , ( Node * ) object ,
relp , lockmode , missing_ok ) ;
}
@ -1096,68 +1106,12 @@ get_object_address_rv(ObjectType objtype, RangeVar *rel, List *objname,
*/
static ObjectAddress
get_object_address_unqualified ( ObjectType objtype ,
List * qualname , bool missing_ok )
Value * strval , bool missing_ok )
{
const char * name ;
ObjectAddress address ;
/*
* The types of names handled by this function are not permitted to be
* schema - qualified or catalog - qualified .
*/
if ( list_length ( qualname ) ! = 1 )
{
const char * msg ;
switch ( objtype )
{
case OBJECT_ACCESS_METHOD :
msg = gettext_noop ( " access method name cannot be qualified " ) ;
break ;
case OBJECT_DATABASE :
msg = gettext_noop ( " database name cannot be qualified " ) ;
break ;
case OBJECT_EXTENSION :
msg = gettext_noop ( " extension name cannot be qualified " ) ;
break ;
case OBJECT_TABLESPACE :
msg = gettext_noop ( " tablespace name cannot be qualified " ) ;
break ;
case OBJECT_ROLE :
msg = gettext_noop ( " role name cannot be qualified " ) ;
break ;
case OBJECT_SCHEMA :
msg = gettext_noop ( " schema name cannot be qualified " ) ;
break ;
case OBJECT_LANGUAGE :
msg = gettext_noop ( " language name cannot be qualified " ) ;
break ;
case OBJECT_FDW :
msg = gettext_noop ( " foreign-data wrapper name cannot be qualified " ) ;
break ;
case OBJECT_FOREIGN_SERVER :
msg = gettext_noop ( " server name cannot be qualified " ) ;
break ;
case OBJECT_EVENT_TRIGGER :
msg = gettext_noop ( " event trigger name cannot be qualified " ) ;
break ;
case OBJECT_PUBLICATION :
msg = gettext_noop ( " publication name cannot be qualified " ) ;
break ;
case OBJECT_SUBSCRIPTION :
msg = gettext_noop ( " subscription name cannot be qualified " ) ;
break ;
default :
elog ( ERROR , " unrecognized objtype: %d " , ( int ) objtype ) ;
msg = NULL ; /* placate compiler */
}
ereport ( ERROR ,
( errcode ( ERRCODE_SYNTAX_ERROR ) ,
errmsg ( " %s " , _ ( msg ) ) ) ) ;
}
/* Format is valid, extract the actual name. */
name = strVal ( linitial ( qualname ) ) ;
name = strVal ( strval ) ;
/* Translate name to OID. */
switch ( objtype )
@ -1237,7 +1191,7 @@ get_object_address_unqualified(ObjectType objtype,
* Locate a relation by qualified name .
*/
static ObjectAddress
get_relation_by_qualified_name ( ObjectType objtype , List * objnam e ,
get_relation_by_qualified_name ( ObjectType objtype , List * object ,
Relation * relp , LOCKMODE lockmode ,
bool missing_ok )
{
@ -1248,7 +1202,7 @@ get_relation_by_qualified_name(ObjectType objtype, List *objname,
address . objectId = InvalidOid ;
address . objectSubId = 0 ;
relation = relation_openrv_extended ( makeRangeVarFromNameList ( objnam e ) ,
relation = relation_openrv_extended ( makeRangeVarFromNameList ( object ) ,
lockmode , missing_ok ) ;
if ( ! relation )
return address ;
@ -1318,7 +1272,7 @@ get_relation_by_qualified_name(ObjectType objtype, List *objname,
* mode for the object itself , not the relation to which it is attached .
*/
static ObjectAddress
get_object_address_relobject ( ObjectType objtype , List * objnam e ,
get_object_address_relobject ( ObjectType objtype , List * object ,
Relation * relp , bool missing_ok )
{
ObjectAddress address ;
@ -1329,17 +1283,17 @@ get_object_address_relobject(ObjectType objtype, List *objname,
Oid reloid ;
/* Extract name of dependent object. */
depname = strVal ( llast ( objnam e ) ) ;
depname = strVal ( llast ( object ) ) ;
/* Separate relation name from dependent object name. */
nnames = list_length ( objnam e ) ;
nnames = list_length ( object ) ;
if ( nnames < 2 )
ereport ( ERROR ,
( errcode ( ERRCODE_SYNTAX_ERROR ) ,
errmsg ( " must specify relation and object name " ) ) ) ;
/* Extract relation name and open relation. */
relname = list_truncate ( list_copy ( objnam e ) , nnames - 1 ) ;
relname = list_truncate ( list_copy ( object ) , nnames - 1 ) ;
relation = heap_openrv_extended ( makeRangeVarFromNameList ( relname ) ,
AccessShareLock ,
missing_ok ) ;
@ -1397,7 +1351,7 @@ get_object_address_relobject(ObjectType objtype, List *objname,
* Find the ObjectAddress for an attribute .
*/
static ObjectAddress
get_object_address_attribute ( ObjectType objtype , List * objnam e ,
get_object_address_attribute ( ObjectType objtype , List * object ,
Relation * relp , LOCKMODE lockmode ,
bool missing_ok )
{
@ -1409,12 +1363,12 @@ get_object_address_attribute(ObjectType objtype, List *objname,
AttrNumber attnum ;
/* Extract relation name and open relation. */
if ( list_length ( objnam e ) < 2 )
if ( list_length ( object ) < 2 )
ereport ( ERROR ,
( errcode ( ERRCODE_SYNTAX_ERROR ) ,
errmsg ( " column name must be qualified " ) ) ) ;
attname = strVal ( lfirst ( list_tail ( objnam e ) ) ) ;
relname = list_truncate ( list_copy ( objnam e ) , list_length ( objnam e ) - 1 ) ;
attname = strVal ( lfirst ( list_tail ( object ) ) ) ;
relname = list_truncate ( list_copy ( object ) , list_length ( object ) - 1 ) ;
/* XXX no missing_ok support here */
relation = relation_openrv ( makeRangeVarFromNameList ( relname ) , lockmode ) ;
reloid = RelationGetRelid ( relation ) ;
@ -1448,7 +1402,7 @@ get_object_address_attribute(ObjectType objtype, List *objname,
* Find the ObjectAddress for an attribute ' s default value .
*/
static ObjectAddress
get_object_address_attrdef ( ObjectType objtype , List * objnam e ,
get_object_address_attrdef ( ObjectType objtype , List * object ,
Relation * relp , LOCKMODE lockmode ,
bool missing_ok )
{
@ -1462,12 +1416,12 @@ get_object_address_attrdef(ObjectType objtype, List *objname,
Oid defoid ;
/* Extract relation name and open relation. */
if ( list_length ( objnam e ) < 2 )
if ( list_length ( object ) < 2 )
ereport ( ERROR ,
( errcode ( ERRCODE_SYNTAX_ERROR ) ,
errmsg ( " column name must be qualified " ) ) ) ;
attname = strVal ( llast ( objnam e ) ) ;
relname = list_truncate ( list_copy ( objnam e ) , list_length ( objnam e ) - 1 ) ;
attname = strVal ( llast ( object ) ) ;
relname = list_truncate ( list_copy ( object ) , list_length ( object ) - 1 ) ;
/* XXX no missing_ok support here */
relation = relation_openrv ( makeRangeVarFromNameList ( relname ) , lockmode ) ;
reloid = RelationGetRelid ( relation ) ;
@ -1530,14 +1484,11 @@ get_object_address_attrdef(ObjectType objtype, List *objname,
* Find the ObjectAddress for a type or domain
*/
static ObjectAddress
get_object_address_type ( ObjectType objtype , ListCell * typecell , bool missing_ok )
get_object_address_type ( ObjectType objtype , TypeName * typename , bool missing_ok )
{
ObjectAddress address ;
TypeName * typename ;
Type tup ;
typename = ( TypeName * ) lfirst ( typecell ) ;
address . classId = TypeRelationId ;
address . objectId = InvalidOid ;
address . objectSubId = 0 ;
@ -1572,25 +1523,25 @@ get_object_address_type(ObjectType objtype, ListCell *typecell, bool missing_ok)
* Find the ObjectAddress for an opclass or opfamily .
*/
static ObjectAddress
get_object_address_opcf ( ObjectType objtype , List * objnam e , bool missing_ok )
get_object_address_opcf ( ObjectType objtype , List * object , bool missing_ok )
{
Oid amoid ;
ObjectAddress address ;
/* XXX no missing_ok support here */
amoid = get_index_am_oid ( strVal ( linitial ( objnam e ) ) , false ) ;
objnam e = list_copy_tail ( objnam e , 1 ) ;
amoid = get_index_am_oid ( strVal ( linitial ( object ) ) , false ) ;
object = list_copy_tail ( object , 1 ) ;
switch ( objtype )
{
case OBJECT_OPCLASS :
address . classId = OperatorClassRelationId ;
address . objectId = get_opclass_oid ( amoid , objnam e , missing_ok ) ;
address . objectId = get_opclass_oid ( amoid , object , missing_ok ) ;
address . objectSubId = 0 ;
break ;
case OBJECT_OPFAMILY :
address . classId = OperatorFamilyRelationId ;
address . objectId = get_opfamily_oid ( amoid , objnam e , missing_ok ) ;
address . objectId = get_opfamily_oid ( amoid , object , missing_ok ) ;
address . objectSubId = 0 ;
break ;
default :
@ -1611,7 +1562,7 @@ get_object_address_opcf(ObjectType objtype, List *objname, bool missing_ok)
*/
static ObjectAddress
get_object_address_opf_member ( ObjectType objtype ,
List * objnam e , Lis t * objargs , bool missing_ok )
List * objec t , bool missing_ok )
{
ObjectAddress famaddr ;
ObjectAddress address ;
@ -1623,24 +1574,24 @@ get_object_address_opf_member(ObjectType objtype,
int i ;
/*
* The last element of the objnam e list contains the strategy or procedure
* The last element of the object list contains the strategy or procedure
* number . We need to strip that out before getting the opclass / family
* address . The rest can be used directly by get_object_address_opcf ( ) .
*/
membernum = atoi ( strVal ( llast ( objname ) ) ) ;
copy = list_truncate ( list_copy ( objname ) , list_length ( objname ) - 1 ) ;
membernum = atoi ( strVal ( llast ( linitial ( object ) ) ) ) ;
copy = list_truncate ( list_copy ( linitial ( object ) ) , list_length ( linitial ( object ) ) - 1 ) ;
/* no missing_ok support here */
famaddr = get_object_address_opcf ( OBJECT_OPFAMILY , copy , false ) ;
/* find out left/right type names and OIDs */
i = 0 ;
foreach ( cell , objargs )
foreach ( cell , lsecond ( object ) )
{
ObjectAddress typaddr ;
typenames [ i ] = strVal ( lfirst ( cell ) ) ;
typaddr = get_object_address_type ( OBJECT_TYPE , cell , missing_ok ) ;
typaddr = get_object_address_type ( OBJECT_TYPE , castNode ( TypeName , lfirst ( c ell ) ) , missing_ok ) ;
typeoids [ i ] = typaddr . objectId ;
if ( + + i > = 2 )
break ;
@ -1716,7 +1667,7 @@ get_object_address_opf_member(ObjectType objtype,
* Find the ObjectAddress for a user mapping .
*/
static ObjectAddress
get_object_address_usermapping ( List * objnam e , Lis t * objargs , bool missing_ok )
get_object_address_usermapping ( List * objec t , bool missing_ok )
{
ObjectAddress address ;
Oid userid ;
@ -1728,8 +1679,8 @@ get_object_address_usermapping(List *objname, List *objargs, bool missing_ok)
ObjectAddressSet ( address , UserMappingRelationId , InvalidOid ) ;
/* fetch string names from input lists, for error messages */
username = strVal ( linitial ( objnam e ) ) ;
servername = strVal ( linitial ( objargs ) ) ;
username = strVal ( linitial ( object ) ) ;
servername = strVal ( lsecond ( object ) ) ;
/* look up pg_authid OID of mapped user; InvalidOid if PUBLIC */
if ( strcmp ( username , " public " ) = = 0 )
@ -1782,27 +1733,30 @@ get_object_address_usermapping(List *objname, List *objargs, bool missing_ok)
}
/*
* Find the ObjectAddress for a publication relation . The objname parameter
* is the relation name ; objargs contains the publication name .
* Find the ObjectAddress for a publication relation . The first element of
* the object parameter is the relation name , the second is the
* publication name .
*/
static ObjectAddress
get_object_address_publication_rel ( List * objnam e , Lis t * objargs ,
get_object_address_publication_rel ( List * objec t ,
Relation * relp , bool missing_ok )
{
ObjectAddress address ;
Relation relation ;
List * relname ;
char * pubname ;
Publication * pub ;
ObjectAddressSet ( address , PublicationRelRelationId , InvalidOid ) ;
relation = relation_openrv_extended ( makeRangeVarFromNameList ( objname ) ,
relname = linitial ( object ) ;
relation = relation_openrv_extended ( makeRangeVarFromNameList ( relname ) ,
AccessShareLock , missing_ok ) ;
if ( ! relation )
return address ;
/* fetch publication name from input list */
pubname = strVal ( linitial ( objargs ) ) ;
pubname = strVal ( lsecond ( object ) ) ;
/* Now look up the pg_publication tuple */
pub = GetPublicationByName ( pubname , missing_ok ) ;
@ -1836,7 +1790,7 @@ get_object_address_publication_rel(List *objname, List *objargs,
* Find the ObjectAddress for a default ACL .
*/
static ObjectAddress
get_object_address_defacl ( List * objnam e , Lis t * objargs , bool missing_ok )
get_object_address_defacl ( List * objec t , bool missing_ok )
{
HeapTuple tp ;
Oid userid ;
@ -1853,9 +1807,9 @@ get_object_address_defacl(List *objname, List *objargs, bool missing_ok)
* First figure out the textual attributes so that they can be used for
* error reporting .
*/
username = strVal ( linitial ( objnam e ) ) ;
if ( list_length ( objnam e ) > = 2 )
schema = ( char * ) strVal ( lsecon d ( objnam e ) ) ;
username = strVal ( lsecond ( object ) ) ;
if ( list_length ( object ) > = 3 )
schema = ( char * ) strVal ( lthir d ( object ) ) ;
else
schema = NULL ;
@ -1863,7 +1817,7 @@ get_object_address_defacl(List *objname, List *objargs, bool missing_ok)
* Decode defaclobjtype . Only first char is considered ; the rest of the
* string , if any , is blissfully ignored .
*/
objtype = ( ( char * ) strVal ( linitial ( objargs ) ) ) [ 0 ] ;
objtype = ( ( char * ) strVal ( linitial ( object ) ) ) [ 0 ] ;
switch ( objtype )
{
case DEFACLOBJ_RELATION :
@ -1978,8 +1932,10 @@ pg_get_object_address(PG_FUNCTION_ARGS)
ArrayType * argsarr = PG_GETARG_ARRAYTYPE_P ( 2 ) ;
int itype ;
ObjectType type ;
List * name ;
List * args ;
List * name = NIL ;
TypeName * typename = NULL ;
List * args = NIL ;
Node * objnode = NULL ;
ObjectAddress addr ;
TupleDesc tupdesc ;
Datum values [ 3 ] ;
@ -2017,7 +1973,7 @@ pg_get_object_address(PG_FUNCTION_ARGS)
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_PARAMETER_VALUE ) ,
errmsg ( " name or argument lists may not contain nulls " ) ) ) ;
name = list_make1 ( typeStringToTypeName ( TextDatumGetCString ( elems [ 0 ] ) ) ) ;
typename = typeStringToTypeName ( TextDatumGetCString ( elems [ 0 ] ) ) ;
}
else if ( type = = OBJECT_LARGEOBJECT )
{
@ -2035,7 +1991,7 @@ pg_get_object_address(PG_FUNCTION_ARGS)
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_PARAMETER_VALUE ) ,
errmsg ( " large object OID may not be null " ) ) ) ;
name = list_make1 ( makeFloat ( TextDatumGetCString ( elems [ 0 ] ) ) ) ;
objnode = ( Node * ) makeFloat ( TextDatumGetCString ( elems [ 0 ] ) ) ;
}
else
{
@ -2123,7 +2079,96 @@ pg_get_object_address(PG_FUNCTION_ARGS)
break ;
}
addr = get_object_address ( type , name , args ,
/*
* Now build the Node type that get_object_name ( ) expects for the given
* type .
*/
switch ( type )
{
case OBJECT_TABLE :
case OBJECT_SEQUENCE :
case OBJECT_VIEW :
case OBJECT_MATVIEW :
case OBJECT_INDEX :
case OBJECT_FOREIGN_TABLE :
case OBJECT_COLUMN :
case OBJECT_ATTRIBUTE :
case OBJECT_COLLATION :
case OBJECT_CONVERSION :
case OBJECT_TSPARSER :
case OBJECT_TSDICTIONARY :
case OBJECT_TSTEMPLATE :
case OBJECT_TSCONFIGURATION :
case OBJECT_DEFAULT :
case OBJECT_POLICY :
case OBJECT_RULE :
case OBJECT_TRIGGER :
case OBJECT_TABCONSTRAINT :
case OBJECT_OPCLASS :
case OBJECT_OPFAMILY :
objnode = ( Node * ) name ;
break ;
case OBJECT_ACCESS_METHOD :
case OBJECT_DATABASE :
case OBJECT_EVENT_TRIGGER :
case OBJECT_EXTENSION :
case OBJECT_FDW :
case OBJECT_FOREIGN_SERVER :
case OBJECT_LANGUAGE :
case OBJECT_PUBLICATION :
case OBJECT_ROLE :
case OBJECT_SCHEMA :
case OBJECT_SUBSCRIPTION :
case OBJECT_TABLESPACE :
if ( list_length ( name ) ! = 1 )
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_PARAMETER_VALUE ) ,
errmsg ( " name list length must be exactly %d " , 1 ) ) ) ;
objnode = linitial ( name ) ;
break ;
case OBJECT_TYPE :
case OBJECT_DOMAIN :
objnode = ( Node * ) typename ;
break ;
case OBJECT_CAST :
case OBJECT_DOMCONSTRAINT :
case OBJECT_TRANSFORM :
objnode = ( Node * ) list_make2 ( typename , linitial ( args ) ) ;
break ;
case OBJECT_PUBLICATION_REL :
objnode = ( Node * ) list_make2 ( name , linitial ( args ) ) ;
break ;
case OBJECT_USER_MAPPING :
objnode = ( Node * ) list_make2 ( linitial ( name ) , linitial ( args ) ) ;
break ;
case OBJECT_DEFACL :
objnode = ( Node * ) lcons ( linitial ( args ) , name ) ;
break ;
case OBJECT_AMOP :
case OBJECT_AMPROC :
objnode = ( Node * ) list_make2 ( name , args ) ;
break ;
case OBJECT_FUNCTION :
case OBJECT_AGGREGATE :
case OBJECT_OPERATOR :
{
ObjectWithArgs * owa = makeNode ( ObjectWithArgs ) ;
owa - > objname = name ;
owa - > objargs = args ;
objnode = ( Node * ) owa ;
break ;
}
case OBJECT_LARGEOBJECT :
/* already handled above */
break ;
/* no default, to let compiler warn about missing case */
}
if ( objnode = = NULL )
elog ( ERROR , " unrecognized object type: %d " , type ) ;
addr = get_object_address ( type , objnode ,
& relation , AccessShareLock , false ) ;
/* We don't need the relcache entry, thank you very much */
@ -2156,7 +2201,7 @@ pg_get_object_address(PG_FUNCTION_ARGS)
*/
void
check_object_ownership ( Oid roleid , ObjectType objtype , ObjectAddress address ,
List * objnam e , Lis t * objargs , Relation relation )
Node * objec t , Relation relation )
{
switch ( objtype )
{
@ -2178,7 +2223,7 @@ check_object_ownership(Oid roleid, ObjectType objtype, ObjectAddress address,
case OBJECT_DATABASE :
if ( ! pg_database_ownercheck ( address . objectId , roleid ) )
aclcheck_error ( ACLCHECK_NOT_OWNER , ACL_KIND_DATABASE ,
NameListToString ( objname ) ) ;
strVal ( ( Value * ) object ) ) ;
break ;
case OBJECT_TYPE :
case OBJECT_DOMAIN :
@ -2191,62 +2236,62 @@ check_object_ownership(Oid roleid, ObjectType objtype, ObjectAddress address,
case OBJECT_FUNCTION :
if ( ! pg_proc_ownercheck ( address . objectId , roleid ) )
aclcheck_error ( ACLCHECK_NOT_OWNER , ACL_KIND_PROC ,
NameListToString ( objname ) ) ;
NameListToString ( ( castNode ( ObjectWithArgs , object ) ) - > objname ) ) ;
break ;
case OBJECT_OPERATOR :
if ( ! pg_oper_ownercheck ( address . objectId , roleid ) )
aclcheck_error ( ACLCHECK_NOT_OWNER , ACL_KIND_OPER ,
NameListToString ( objname ) ) ;
NameListToString ( ( castNode ( ObjectWithArgs , object ) ) - > objname ) ) ;
break ;
case OBJECT_SCHEMA :
if ( ! pg_namespace_ownercheck ( address . objectId , roleid ) )
aclcheck_error ( ACLCHECK_NOT_OWNER , ACL_KIND_NAMESPACE ,
NameListToString ( objname ) ) ;
strVal ( ( Value * ) object ) ) ;
break ;
case OBJECT_COLLATION :
if ( ! pg_collation_ownercheck ( address . objectId , roleid ) )
aclcheck_error ( ACLCHECK_NOT_OWNER , ACL_KIND_COLLATION ,
NameListToString ( objname ) ) ;
NameListToString ( castNode ( List , object ) ) ) ;
break ;
case OBJECT_CONVERSION :
if ( ! pg_conversion_ownercheck ( address . objectId , roleid ) )
aclcheck_error ( ACLCHECK_NOT_OWNER , ACL_KIND_CONVERSION ,
NameListToString ( objname ) ) ;
NameListToString ( castNode ( List , object ) ) ) ;
break ;
case OBJECT_EXTENSION :
if ( ! pg_extension_ownercheck ( address . objectId , roleid ) )
aclcheck_error ( ACLCHECK_NOT_OWNER , ACL_KIND_EXTENSION ,
NameListToString ( objname ) ) ;
strVal ( ( Value * ) object ) ) ;
break ;
case OBJECT_FDW :
if ( ! pg_foreign_data_wrapper_ownercheck ( address . objectId , roleid ) )
aclcheck_error ( ACLCHECK_NOT_OWNER , ACL_KIND_FDW ,
NameListToString ( objname ) ) ;
strVal ( ( Value * ) object ) ) ;
break ;
case OBJECT_FOREIGN_SERVER :
if ( ! pg_foreign_server_ownercheck ( address . objectId , roleid ) )
aclcheck_error ( ACLCHECK_NOT_OWNER , ACL_KIND_FOREIGN_SERVER ,
NameListToString ( objname ) ) ;
strVal ( ( Value * ) object ) ) ;
break ;
case OBJECT_EVENT_TRIGGER :
if ( ! pg_event_trigger_ownercheck ( address . objectId , roleid ) )
aclcheck_error ( ACLCHECK_NOT_OWNER , ACL_KIND_EVENT_TRIGGER ,
NameListToString ( objname ) ) ;
strVal ( ( Value * ) object ) ) ;
break ;
case OBJECT_LANGUAGE :
if ( ! pg_language_ownercheck ( address . objectId , roleid ) )
aclcheck_error ( ACLCHECK_NOT_OWNER , ACL_KIND_LANGUAGE ,
NameListToString ( objname ) ) ;
strVal ( ( Value * ) object ) ) ;
break ;
case OBJECT_OPCLASS :
if ( ! pg_opclass_ownercheck ( address . objectId , roleid ) )
aclcheck_error ( ACLCHECK_NOT_OWNER , ACL_KIND_OPCLASS ,
NameListToString ( objname ) ) ;
NameListToString ( castNode ( List , object ) ) ) ;
break ;
case OBJECT_OPFAMILY :
if ( ! pg_opfamily_ownercheck ( address . objectId , roleid ) )
aclcheck_error ( ACLCHECK_NOT_OWNER , ACL_KIND_OPFAMILY ,
NameListToString ( objname ) ) ;
NameListToString ( castNode ( List , object ) ) ) ;
break ;
case OBJECT_LARGEOBJECT :
if ( ! lo_compat_privileges & &
@ -2259,8 +2304,8 @@ check_object_ownership(Oid roleid, ObjectType objtype, ObjectAddress address,
case OBJECT_CAST :
{
/* We can only check permissions on the source/target types */
TypeName * sourcetype = ( TypeName * ) linitial ( objname ) ;
TypeName * targettype = ( TypeName * ) linitial ( objargs ) ;
TypeName * sourcetype = castNode ( TypeName , linitial ( castNode ( List , object ) ) ) ;
TypeName * targettype = castNode ( TypeName , lsecond ( castNode ( List , object ) ) ) ;
Oid sourcetypeid = typenameTypeId ( NULL , sourcetype ) ;
Oid targettypeid = typenameTypeId ( NULL , targettype ) ;
@ -2276,16 +2321,16 @@ check_object_ownership(Oid roleid, ObjectType objtype, ObjectAddress address,
case OBJECT_PUBLICATION :
if ( ! pg_publication_ownercheck ( address . objectId , roleid ) )
aclcheck_error ( ACLCHECK_NOT_OWNER , ACL_KIND_PUBLICATION ,
NameListToString ( objname ) ) ;
strVal ( ( Value * ) object ) ) ;
break ;
case OBJECT_SUBSCRIPTION :
if ( ! pg_subscription_ownercheck ( address . objectId , roleid ) )
aclcheck_error ( ACLCHECK_NOT_OWNER , ACL_KIND_SUBSCRIPTION ,
NameListToString ( objname ) ) ;
strVal ( ( Value * ) object ) ) ;
break ;
case OBJECT_TRANSFORM :
{
TypeName * typename = ( TypeName * ) linitial ( objname ) ;
TypeName * typename = castNode ( TypeName , linitial ( castNode ( List , object ) ) ) ;
Oid typeid = typenameTypeId ( NULL , typename ) ;
if ( ! pg_type_ownercheck ( typeid , roleid ) )
@ -2295,17 +2340,17 @@ check_object_ownership(Oid roleid, ObjectType objtype, ObjectAddress address,
case OBJECT_TABLESPACE :
if ( ! pg_tablespace_ownercheck ( address . objectId , roleid ) )
aclcheck_error ( ACLCHECK_NOT_OWNER , ACL_KIND_TABLESPACE ,
NameListToString ( objname ) ) ;
strVal ( ( Value * ) object ) ) ;
break ;
case OBJECT_TSDICTIONARY :
if ( ! pg_ts_dict_ownercheck ( address . objectId , roleid ) )
aclcheck_error ( ACLCHECK_NOT_OWNER , ACL_KIND_TSDICTIONARY ,
NameListToString ( objname ) ) ;
NameListToString ( castNode ( List , object ) ) ) ;
break ;
case OBJECT_TSCONFIGURATION :
if ( ! pg_ts_config_ownercheck ( address . objectId , roleid ) )
aclcheck_error ( ACLCHECK_NOT_OWNER , ACL_KIND_TSCONFIGURATION ,
NameListToString ( objname ) ) ;
NameListToString ( castNode ( List , object ) ) ) ;
break ;
case OBJECT_ROLE :
@ -4868,7 +4913,7 @@ getObjectIdentityParts(const ObjectAddress *object,
}
static void
getOpFamilyIdentity ( StringInfo buffer , Oid opfid , List * * objnam e )
getOpFamilyIdentity ( StringInfo buffer , Oid opfid , List * * object )
{
HeapTuple opfTup ;
Form_pg_opfamily opfForm ;
@ -4893,8 +4938,8 @@ getOpFamilyIdentity(StringInfo buffer, Oid opfid, List **objname)
NameStr ( opfForm - > opfname ) ) ,
NameStr ( amForm - > amname ) ) ;
if ( objnam e )
* objnam e = list_make3 ( pstrdup ( NameStr ( amForm - > amname ) ) ,
if ( object )
* object = list_make3 ( pstrdup ( NameStr ( amForm - > amname ) ) ,
pstrdup ( schema ) ,
pstrdup ( NameStr ( opfForm - > opfname ) ) ) ;
@ -4907,7 +4952,7 @@ getOpFamilyIdentity(StringInfo buffer, Oid opfid, List **objname)
* StringInfo .
*/
static void
getRelationIdentity ( StringInfo buffer , Oid relid , List * * objnam e )
getRelationIdentity ( StringInfo buffer , Oid relid , List * * object )
{
HeapTuple relTup ;
Form_pg_class relForm ;
@ -4923,8 +4968,8 @@ getRelationIdentity(StringInfo buffer, Oid relid, List **objname)
appendStringInfoString ( buffer ,
quote_qualified_identifier ( schema ,
NameStr ( relForm - > relname ) ) ) ;
if ( objnam e )
* objnam e = list_make2 ( schema , pstrdup ( NameStr ( relForm - > relname ) ) ) ;
if ( object )
* object = list_make2 ( schema , pstrdup ( NameStr ( relForm - > relname ) ) ) ;
ReleaseSysCache ( relTup ) ;
}