* Get publication actions for the given relation. */
| 5812 | * Get publication actions for the given relation. |
| 5813 | */ |
| 5814 | struct PublicationActions * |
| 5815 | GetRelationPublicationActions(Relation relation) |
| 5816 | { |
| 5817 | List *puboids; |
| 5818 | ListCell *lc; |
| 5819 | MemoryContext oldcxt; |
| 5820 | PublicationActions *pubactions = palloc0(sizeof(PublicationActions)); |
| 5821 | |
| 5822 | /* |
| 5823 | * If not publishable, it publishes no actions. (pgoutput_change() will |
| 5824 | * ignore it.) |
| 5825 | */ |
| 5826 | if (!is_publishable_relation(relation)) |
| 5827 | return pubactions; |
| 5828 | |
| 5829 | if (relation->rd_pubactions) |
| 5830 | return memcpy(pubactions, relation->rd_pubactions, |
| 5831 | sizeof(PublicationActions)); |
| 5832 | |
| 5833 | /* Fetch the publication membership info. */ |
| 5834 | puboids = GetRelationPublications(RelationGetRelid(relation)); |
| 5835 | if (relation->rd_rel->relispartition) |
| 5836 | { |
| 5837 | /* Add publications that the ancestors are in too. */ |
| 5838 | List *ancestors = get_partition_ancestors(RelationGetRelid(relation)); |
| 5839 | ListCell *lc; |
| 5840 | |
| 5841 | foreach(lc, ancestors) |
| 5842 | { |
| 5843 | Oid ancestor = lfirst_oid(lc); |
| 5844 | |
| 5845 | puboids = list_concat_unique_oid(puboids, |
| 5846 | GetRelationPublications(ancestor)); |
| 5847 | } |
| 5848 | } |
| 5849 | puboids = list_concat_unique_oid(puboids, GetAllTablesPublications()); |
| 5850 | |
| 5851 | foreach(lc, puboids) |
| 5852 | { |
| 5853 | Oid pubid = lfirst_oid(lc); |
| 5854 | HeapTuple tup; |
| 5855 | Form_pg_publication pubform; |
| 5856 | |
| 5857 | tup = SearchSysCache1(PUBLICATIONOID, ObjectIdGetDatum(pubid)); |
| 5858 | |
| 5859 | if (!HeapTupleIsValid(tup)) |
| 5860 | elog(ERROR, "cache lookup failed for publication %u", pubid); |
| 5861 | |
| 5862 | pubform = (Form_pg_publication) GETSTRUCT(tup); |
| 5863 | |
| 5864 | pubactions->pubinsert |= pubform->pubinsert; |
| 5865 | pubactions->pubupdate |= pubform->pubupdate; |
| 5866 | pubactions->pubdelete |= pubform->pubdelete; |
| 5867 | pubactions->pubtruncate |= pubform->pubtruncate; |
| 5868 | |
| 5869 | ReleaseSysCache(tup); |
| 5870 | |
| 5871 | /* |
no test coverage detected