@@ -1089,6 +1089,223 @@ test_sub=# SELECT * FROM child ORDER BY a;
10891089
10901090 </sect1>
10911091
1092+ <sect1 id="logical-replication-col-lists">
1093+ <title>Column Lists</title>
1094+
1095+ <para>
1096+ By default, all columns of a published table will be replicated to the
1097+ appropriate subscribers. The subscriber table must have at least all the
1098+ columns of the published table. However, if a
1099+ <firstterm>column list</firstterm> is specified then only the columns named
1100+ in the list will be replicated. This means the subscriber-side table only
1101+ needs to have those columns named by the column list. A user might choose to
1102+ use column lists for behavioral, security or performance reasons.
1103+ </para>
1104+
1105+ <sect2 id="logical-replication-col-list-rules">
1106+ <title>Column List Rules</title>
1107+
1108+ <para>
1109+ A column list is specified per table following the table name, and enclosed
1110+ by parentheses. See <xref linkend="sql-createpublication"/> for details.
1111+ </para>
1112+
1113+ <para>
1114+ When specifying a column list, the order of columns is not important. If no
1115+ column list is specified, all columns of the table are replicated through
1116+ this publication, including any columns added later. This means a column
1117+ list which names all columns is not quite the same as having no column list
1118+ at all. For example, if additional columns are added to the table then only
1119+ those named columns mentioned in the column list will continue to be
1120+ replicated.
1121+ </para>
1122+
1123+ <para>
1124+ Column lists have no effect for <literal>TRUNCATE</literal> command.
1125+ </para>
1126+
1127+ </sect2>
1128+
1129+ <sect2 id="logical-replication-col-list-restrictions">
1130+ <title>Column List Restrictions</title>
1131+
1132+ <para>
1133+ A column list can contain only simple column references.
1134+ </para>
1135+
1136+ <para>
1137+ If a publication publishes <command>UPDATE</command> or
1138+ <command>DELETE</command> operations, any column list must include the
1139+ table's replica identity columns (see
1140+ <xref linkend="sql-altertable-replica-identity"/>).
1141+ If a publication publishes only <command>INSERT</command> operations, then
1142+ the column list is arbitrary and may omit some replica identity columns.
1143+ </para>
1144+
1145+ </sect2>
1146+
1147+ <sect2 id="logical-replication-col-list-partitioned">
1148+ <title>Partitioned Tables</title>
1149+
1150+ <para>
1151+ For partitioned tables, the publication parameter
1152+ <literal>publish_via_partition_root</literal> determines which column list
1153+ is used. If <literal>publish_via_partition_root</literal> is
1154+ <literal>true</literal>, the root partitioned table's column list is used.
1155+ Otherwise, if <literal>publish_via_partition_root</literal> is
1156+ <literal>false</literal> (default), each partition's column list is used.
1157+ </para>
1158+
1159+ </sect2>
1160+
1161+ <sect2 id="logical-replication-col-list-initial-data-sync">
1162+ <title>Initial Data Synchronization</title>
1163+
1164+ <para>
1165+ If the subscription requires copying pre-existing table data and a
1166+ publication specifies a column list, only data from those columns will be
1167+ copied.
1168+ </para>
1169+
1170+ <note>
1171+ <para>
1172+ If the subscriber is in a release prior to 15, copy pre-existing data
1173+ doesn't use column lists even if they are defined in the publication.
1174+ This is because old releases can only copy the entire table data.
1175+ </para>
1176+ </note>
1177+
1178+ </sect2>
1179+
1180+ <sect2 id="logical-replication-col-list-combining">
1181+ <title>Combining Multiple Column Lists</title>
1182+
1183+ <warning>
1184+ <para>
1185+ It is not supported to have a subscription comprising several publications
1186+ where the same table has been published with different column lists.
1187+ This means changing the column lists of the tables being subscribed could
1188+ cause inconsistency of column lists among publications, in which case
1189+ the <xref linkend="sql-alterpublication"/> will be successful but later
1190+ the walsender on the publisher, or the subscriber may throw an error. In
1191+ this scenario, the user needs to recreate the subscription after adjusting
1192+ the column list or drop the problematic publication using
1193+ <literal>ALTER SUBSCRIPTION ... DROP PUBLICATION</literal> and then add it
1194+ back after adjusting the column list.
1195+ </para>
1196+ <para>
1197+ Background: The main purpose of the column list feature is to allow
1198+ statically different table shapes on publisher and subscriber, or hide
1199+ sensitive column data. In both cases, it doesn't seem to make sense to
1200+ combine column lists.
1201+ </para>
1202+ </warning>
1203+
1204+ </sect2>
1205+
1206+ <sect2 id="logical-replication-col-list-examples">
1207+ <title>Examples</title>
1208+
1209+ <para>
1210+ Create a table <literal>t1</literal> to be used in the following example.
1211+ <programlisting>
1212+ test_pub=# CREATE TABLE t1(id int, a text, b text, c text, d text, e text, PRIMARY KEY(id));
1213+ CREATE TABLE
1214+ </programlisting></para>
1215+
1216+ <para>
1217+ Create a publication <literal>p1</literal>. A column list is defined for
1218+ table <literal>t1</literal> to reduce the number of columns that will be
1219+ replicated. Notice that the order of column names in the column list does
1220+ not matter.
1221+ <programlisting>
1222+ test_pub=# CREATE PUBLICATION p1 FOR TABLE t1 (id, b, a, d);
1223+ CREATE PUBLICATION
1224+ </programlisting></para>
1225+
1226+ <para>
1227+ <literal>psql</literal> can be used to show the column lists (if defined)
1228+ for each publication.
1229+ <programlisting>
1230+ test_pub=# \dRp+
1231+ Publication p1
1232+ Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root
1233+ ----------+------------+---------+---------+---------+-----------+----------
1234+ postgres | f | t | t | t | t | f
1235+ Tables:
1236+ "public.t1" (id, a, b, d)
1237+ </programlisting></para>
1238+
1239+ <para>
1240+ <literal>psql</literal> can be used to show the column lists (if defined)
1241+ for each table.
1242+ <programlisting>
1243+ test_pub=# \d t1
1244+ Table "public.t1"
1245+ Column | Type | Collation | Nullable | Default
1246+ --------+---------+-----------+----------+---------
1247+ id | integer | | not null |
1248+ a | text | | |
1249+ b | text | | |
1250+ c | text | | |
1251+ d | text | | |
1252+ e | text | | |
1253+ Indexes:
1254+ "t1_pkey" PRIMARY KEY, btree (id)
1255+ Publications:
1256+ "p1" (id, a, b, d)
1257+ </programlisting></para>
1258+
1259+ <para>
1260+ On the subscriber node, create a table <literal>t1</literal> which now
1261+ only needs a subset of the columns that were on the publisher table
1262+ <literal>t1</literal>, and also create the subscription
1263+ <literal>s1</literal> that subscribes to the publication
1264+ <literal>p1</literal>.
1265+ <programlisting>
1266+ test_sub=# CREATE TABLE t1(id int, b text, a text, d text, PRIMARY KEY(id));
1267+ CREATE TABLE
1268+ test_sub=# CREATE SUBSCRIPTION s1
1269+ test_sub-# CONNECTION 'host=localhost dbname=test_pub application_name=s1'
1270+ test_sub-# PUBLICATION p1;
1271+ CREATE SUBSCRIPTION
1272+ </programlisting></para>
1273+
1274+ <para>
1275+ On the publisher node, insert some rows to table <literal>t1</literal>.
1276+ <programlisting>
1277+ test_pub=# INSERT INTO t1 VALUES(1, 'a-1', 'b-1', 'c-1', 'd-1', 'e-1');
1278+ INSERT 0 1
1279+ test_pub=# INSERT INTO t1 VALUES(2, 'a-2', 'b-2', 'c-2', 'd-2', 'e-2');
1280+ INSERT 0 1
1281+ test_pub=# INSERT INTO t1 VALUES(3, 'a-3', 'b-3', 'c-3', 'd-3', 'e-3');
1282+ INSERT 0 1
1283+ test_pub=# SELECT * FROM t1 ORDER BY id;
1284+ id | a | b | c | d | e
1285+ ----+-----+-----+-----+-----+-----
1286+ 1 | a-1 | b-1 | c-1 | d-1 | e-1
1287+ 2 | a-2 | b-2 | c-2 | d-2 | e-2
1288+ 3 | a-3 | b-3 | c-3 | d-3 | e-3
1289+ (3 rows)
1290+ </programlisting></para>
1291+
1292+ <para>
1293+ Only data from the column list of publication <literal>p1</literal> is
1294+ replicated.
1295+ <programlisting>
1296+ test_sub=# SELECT * FROM t1 ORDER BY id;
1297+ id | b | a | d
1298+ ----+-----+-----+-----
1299+ 1 | b-1 | a-1 | d-1
1300+ 2 | b-2 | a-2 | d-2
1301+ 3 | b-3 | a-3 | d-3
1302+ (3 rows)
1303+ </programlisting></para>
1304+
1305+ </sect2>
1306+
1307+ </sect1>
1308+
10921309 <sect1 id="logical-replication-conflicts">
10931310 <title>Conflicts</title>
10941311