|
|
|
|
@ -874,25 +874,18 @@ pg_relation_filenode(PG_FUNCTION_ARGS) |
|
|
|
|
PG_RETURN_NULL(); |
|
|
|
|
relform = (Form_pg_class) GETSTRUCT(tuple); |
|
|
|
|
|
|
|
|
|
switch (relform->relkind) |
|
|
|
|
if (RELKIND_HAS_STORAGE(relform->relkind)) |
|
|
|
|
{ |
|
|
|
|
case RELKIND_RELATION: |
|
|
|
|
case RELKIND_MATVIEW: |
|
|
|
|
case RELKIND_INDEX: |
|
|
|
|
case RELKIND_SEQUENCE: |
|
|
|
|
case RELKIND_TOASTVALUE: |
|
|
|
|
/* okay, these have storage */ |
|
|
|
|
if (relform->relfilenode) |
|
|
|
|
result = relform->relfilenode; |
|
|
|
|
else /* Consult the relation mapper */ |
|
|
|
|
result = RelationMapOidToFilenode(relid, |
|
|
|
|
relform->relisshared); |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
default: |
|
|
|
|
/* no storage, return NULL */ |
|
|
|
|
result = InvalidOid; |
|
|
|
|
break; |
|
|
|
|
if (relform->relfilenode) |
|
|
|
|
result = relform->relfilenode; |
|
|
|
|
else /* Consult the relation mapper */ |
|
|
|
|
result = RelationMapOidToFilenode(relid, |
|
|
|
|
relform->relisshared); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
/* no storage, return NULL */ |
|
|
|
|
result = InvalidOid; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ReleaseSysCache(tuple); |
|
|
|
|
@ -951,38 +944,30 @@ pg_relation_filepath(PG_FUNCTION_ARGS) |
|
|
|
|
PG_RETURN_NULL(); |
|
|
|
|
relform = (Form_pg_class) GETSTRUCT(tuple); |
|
|
|
|
|
|
|
|
|
switch (relform->relkind) |
|
|
|
|
if (RELKIND_HAS_STORAGE(relform->relkind)) |
|
|
|
|
{ |
|
|
|
|
/* This logic should match RelationInitPhysicalAddr */ |
|
|
|
|
if (relform->reltablespace) |
|
|
|
|
rnode.spcNode = relform->reltablespace; |
|
|
|
|
else |
|
|
|
|
rnode.spcNode = MyDatabaseTableSpace; |
|
|
|
|
if (rnode.spcNode == GLOBALTABLESPACE_OID) |
|
|
|
|
rnode.dbNode = InvalidOid; |
|
|
|
|
else |
|
|
|
|
rnode.dbNode = MyDatabaseId; |
|
|
|
|
if (relform->relfilenode) |
|
|
|
|
rnode.relNode = relform->relfilenode; |
|
|
|
|
else /* Consult the relation mapper */ |
|
|
|
|
rnode.relNode = RelationMapOidToFilenode(relid, |
|
|
|
|
relform->relisshared); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
case RELKIND_RELATION: |
|
|
|
|
case RELKIND_MATVIEW: |
|
|
|
|
case RELKIND_INDEX: |
|
|
|
|
case RELKIND_SEQUENCE: |
|
|
|
|
case RELKIND_TOASTVALUE: |
|
|
|
|
/* okay, these have storage */ |
|
|
|
|
|
|
|
|
|
/* This logic should match RelationInitPhysicalAddr */ |
|
|
|
|
if (relform->reltablespace) |
|
|
|
|
rnode.spcNode = relform->reltablespace; |
|
|
|
|
else |
|
|
|
|
rnode.spcNode = MyDatabaseTableSpace; |
|
|
|
|
if (rnode.spcNode == GLOBALTABLESPACE_OID) |
|
|
|
|
rnode.dbNode = InvalidOid; |
|
|
|
|
else |
|
|
|
|
rnode.dbNode = MyDatabaseId; |
|
|
|
|
if (relform->relfilenode) |
|
|
|
|
rnode.relNode = relform->relfilenode; |
|
|
|
|
else /* Consult the relation mapper */ |
|
|
|
|
rnode.relNode = RelationMapOidToFilenode(relid, |
|
|
|
|
relform->relisshared); |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
default: |
|
|
|
|
/* no storage, return NULL */ |
|
|
|
|
rnode.relNode = InvalidOid; |
|
|
|
|
/* some compilers generate warnings without these next two lines */ |
|
|
|
|
rnode.dbNode = InvalidOid; |
|
|
|
|
rnode.spcNode = InvalidOid; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!OidIsValid(rnode.relNode)) |
|
|
|
|
|