Add support for dumping and restoring hypertables that have chunks
that use the Hypercore TAM.
Dumping a Hypercore table requires special consideration because its
data is internally stored in two separate relations: one for
compressed data and one for non-compressed data. The TAM returns data
from both relations, but they may be dumped as separate tables. This
risks dumping the compressed data twice: once via the TAM and once via
the compressed table in compressed format.
The `pg_dump` tool uses `COPY TO` to create dumps of each table, and,
to avoid data duplication when used on Hypercore tables, this change
introduces a GUC that allows selecting one of these two behaviors:
1. A `COPY TO` on a Hypercore table returns all data via the TAM,
including data stored in the compressed relation. A `COPY TO` on
the internal compressed relation returns no data.
2. A `COPY TO` on a Hypercore returns only non-compressed data, while
a `COPY TO` on the compressed relation returns compressed data. A
`SELECT` still returns all the data as normal.
The second approach is the default because it is consistent with
compression when Hypercore TAM is not used. It will produce a
`pg_dump` archive that includes data in compressed form (if data was
compressed when dumped). Conversely, option (1) will produce an
archive that looks identical to a dump from an non-compressed table.
There are pros and cons of each dump format. A non-compressed archive
is a platform-agnostic logical dump that can be restored to any
platform and architecture, while a compressed archive includes data
that is compressed in a platform-dependent way and needs to be
restored to a compatible system.
A test is added that tests both these settings and corresponding
dumping and restoring.