Thread
Commits
-
Add support for LIKE in CREATE FOREIGN TABLE
- 302cf1575923 18.0 landed
-
Proposal to CREATE FOREIGN TABLE LIKE
Zhang Mingli <zmlpostgres@gmail.com> — 2025-02-01T06:55:12Z
Hi, all I wanted to bring up an idea that could really help out. Our DBA team uses foreign tables for ETL processes in Greenplum and Cloudberry, and we often need to create foreign tables that match the column definitions of local tables. When dealing with wide tables and lots of those foreign tables, it can get pretty tedious and mistakes happen easily. We end up having to troubleshoot errors when querying, which is a hassle. Sure, we could use pg_dump to get the table DDL and modify the name, but that just adds more busywork. CREATE FOREIGN TABLE LIKE command could save a lot of time and reduce errors in the long run. It would work similarly to CREATE TABLE LIKE, copying the column definitions and constraints from the source table. And since Postgres doesn’t enforce constraints on foreign tables, it’s up to the user to make sure the constraints match the actual data. https://www.postgresql.org/docs/current/sql-createforeigntable.html This means that enabling CREATE FOREIGN TABLE LIKE shouldn’t introduce more issues with constraints I haven’t rush with the codes yet, but it seems like it could be straightforward to implement by tweaking the existing limitations: ``` static void transformTableLikeClause(CreateStmtContext *cxt, TableLikeClause *table_like_clause) { ... if (cxt->isforeign) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("LIKE is not supported for creating foreign tables"))); } ``` with some test cases and Documents changes. Zhang Mingli www.hashdata.xyz -
Re: Proposal to CREATE FOREIGN TABLE LIKE
Alvaro Herrera <alvherre@alvh.no-ip.org> — 2025-02-01T12:20:17Z
On 2025-Feb-01, Zhang Mingli wrote: > Our DBA team uses foreign tables for ETL processes in Greenplum and Cloudberry, > and we often need to create foreign tables that match the column definitions of local tables. > > When dealing with wide tables and lots of those foreign tables, it can get pretty tedious and mistakes happen easily. Sure. Did you consider IMPORT FOREIGN SCHEMA? -- Álvaro Herrera 48°01'N 7°57'E — https://www.EnterpriseDB.com/ […] indem ich in meinem Leben oft an euch gedacht, euch glücklich zu machen. Seyd es! A menudo he pensado en vosotros, en haceros felices. ¡Sedlo, pues! Heiligenstädter Testament, L. v. Beethoven, 1802 https://de.wikisource.org/wiki/Heiligenstädter_Testament
-
Re: Proposal to CREATE FOREIGN TABLE LIKE
Zhang Mingli <zmlpostgres@gmail.com> — 2025-02-01T13:39:10Z
Zhang Mingli www.hashdata.xyz On Feb 1, 2025 at 20:20 +0800, Álvaro Herrera <alvherre@alvh.no-ip.org>, wrote: > > Sure. Did you consider IMPORT FOREIGN SCHEMA? Hi, Álvaro Thank you very much for your suggestion. I've looked into it, and it certainly can be beneficial, especially for postgres_fdw. However, I believe that not all FDWs support the concept of a schema or can be used with the IMPORT FOREIGN SCHEMA command, is it? For example, we use kafka_fdw to produce and consume data from a Kafka server. In our scenario, we sometimes need to write records from a local table into Kafka. Here’s a brief outline of our process: 1. We already have a wide table, local_wide_table in Postgres. 2. We need to create a foreign table, foreign_table, with the same definition as local_wide_table. 3. Insert records into foreign_table by selecting from local_wide_table with the some quals. In step 2, we currently have to manually create the foreign table using CREATE FOREIGN TABLE and copy the column definitions one by one.
-
Re: Proposal to CREATE FOREIGN TABLE LIKE
Alvaro Herrera <alvherre@alvh.no-ip.org> — 2025-02-02T13:24:29Z
On 2025-Feb-01, Zhang Mingli wrote: > For example, we use kafka_fdw to produce and consume data from a Kafka > server. In our scenario, we sometimes need to write records from a > local table into Kafka. Here’s a brief outline of our process: > > 1. We already have a wide table, local_wide_table in Postgres. > 2. We need to create a foreign table, foreign_table, with the same > definition as local_wide_table. > 3. Insert records into foreign_table by selecting > from local_wide_table with the some quals. > > In step 2, we currently have to manually create the foreign table > using CREATE FOREIGN TABLE and copy the column definitions one by one. Eh yeah, I guess for this use case it makes sense to allow a LIKE clause on CREATE FOREIGN TABLE. Were you going to submit a patch? -- Álvaro Herrera Breisgau, Deutschland — https://www.EnterpriseDB.com/ "Having your biases confirmed independently is how scientific progress is made, and hence made our great society what it is today" (Mary Gardiner)
-
Re: Proposal to CREATE FOREIGN TABLE LIKE
Zhang Mingli <zmlpostgres@gmail.com> — 2025-02-02T22:22:13Z
Zhang Mingli www.hashdata.xyz On Feb 2, 2025 at 21:24 +0800, Álvaro Herrera <alvherre@alvh.no-ip.org>, wrote: Eh yeah, I guess for this use case it makes sense to allow a LIKE clause on CREATE FOREIGN TABLE. Were you going to submit a patch? Hi, Yes, I would like to provide a patch. Glad to see we have come to an agreement on this.
-
Re: Proposal to CREATE FOREIGN TABLE LIKE
Michael Paquier <michael@paquier.xyz> — 2025-02-03T00:29:17Z
On Mon, Feb 03, 2025 at 06:22:13AM +0800, Mingli Zhang wrote: > Yes, I would like to provide a patch. > > Glad to see we have come to an agreement on this. Just adding my +1 here. FWIW. -- Michael
-
Re: Proposal to CREATE FOREIGN TABLE LIKE
Zhang Mingli <zmlpostgres@gmail.com> — 2025-02-06T10:09:42Z
On Feb 3, 2025 at 08:29 +0800, Michael Paquier <michael@paquier.xyz>, wrote: > On Mon, Feb 03, 2025 at 06:22:13AM +0800, Mingli Zhang wrote: > > Yes, I would like to provide a patch. > > > > Glad to see we have come to an agreement on this. > > Just adding my +1 here. FWIW. Hi, Patch added. Added support for CREATE FOREIGN TABLE LIKE to enable the creation of foreign tables based on the column definitions, constraints of existing source tables. This feature mirrors the behavior of CREATE TABLE LIKE, but ignores inapplicable options such as INCLUDING INDEXES and INCLUDING COMPRESSION for foreign tables. I have disallowed the COMPRESSION option due to existing inconsistencies between STORAGE and COMPRESSION. I’ve posted a summary of these issues at Inconsistency between Compression and Storage for Foreign Tables[0]. Once we align the behavior of STORAGE and COMPRESSION, I believe that COMPRESSION should also be copied for foreign tables, similar to STORAGE. This might be beneficial for foreign data wrappers (FDWs) that take it into account. [0] https://www.postgresql.org/message-id/6cecef0e-ee14-473c-bb0a-6aa61f539a66%40Spark -- Zhang Mingli HashData
-
Re: Proposal to CREATE FOREIGN TABLE LIKE
Alvaro Herrera <alvherre@alvh.no-ip.org> — 2025-02-06T10:29:18Z
On 2025-Feb-06, Zhang Mingli wrote: > Added support for CREATE FOREIGN TABLE LIKE to enable the creation of > foreign tables based on the column definitions, constraints of > existing source tables. > This feature mirrors the behavior of CREATE TABLE LIKE, but ignores > inapplicable options such as INCLUDING INDEXES and INCLUDING > COMPRESSION for foreign tables. I think it'd be better to throw errors if they are given -- but INCLUDING ALL should be made to work in a different way than today so that it doesn't raise errors uselessly. Right now it works by setting all the bits in the value, um. -- Álvaro Herrera PostgreSQL Developer — https://www.EnterpriseDB.com/
-
Re: Proposal to CREATE FOREIGN TABLE LIKE
Alvaro Herrera <alvherre@alvh.no-ip.org> — 2025-02-06T10:31:43Z
On 2025-Feb-06, Álvaro Herrera wrote: > On 2025-Feb-06, Zhang Mingli wrote: > > > Added support for CREATE FOREIGN TABLE LIKE to enable the creation of > > foreign tables based on the column definitions, constraints of > > existing source tables. > > This feature mirrors the behavior of CREATE TABLE LIKE, but ignores > > inapplicable options such as INCLUDING INDEXES and INCLUDING > > COMPRESSION for foreign tables. > > I think it'd be better to throw errors if they are given -- but > INCLUDING ALL should be made to work in a different way than today so > that it doesn't raise errors uselessly. Right now it works by setting > all the bits in the value, um. Ah, but our fine manual already says The LIKE clause can also be used to copy column definitions from views, foreign tables, or composite types. Inapplicable options (e.g., INCLUDING INDEXES from a view) are ignored. so what you implemented seems to be okay from that POV. -- Álvaro Herrera Breisgau, Deutschland — https://www.EnterpriseDB.com/ "Investigación es lo que hago cuando no sé lo que estoy haciendo" (Wernher von Braun)
-
Re: Proposal to CREATE FOREIGN TABLE LIKE
Zhang Mingli <zmlpostgres@gmail.com> — 2025-02-06T12:13:47Z
On Feb 6, 2025 at 18:31 +0800, Álvaro Herrera <alvherre@alvh.no-ip.org>, wrote: > > Ah, but our fine manual already says > > The LIKE clause can also be used to copy column definitions from views, > foreign tables, or composite types. Inapplicable options (e.g., > INCLUDING INDEXES from a view) are ignored. > > so what you implemented seems to be okay from that POV. Hi, Yeah, Our current convention is to ignore any inapplicable options without throwing errors. As you mentioned, we use bits to identify the options, which does add some complexity to the codes if we try to track the origin of the option bits. -- Zhang Mingli HashData
-
Re: Proposal to CREATE FOREIGN TABLE LIKE
Zhang Mingli <zmlpostgres@gmail.com> — 2025-02-07T14:24:36Z
On Feb 6, 2025 at 18:09 +0800, Zhang Mingli <zmlpostgres@gmail.com>, wrote: > On Feb 3, 2025 at 08:29 +0800, Michael Paquier <michael@paquier.xyz>, wrote: > > On Mon, Feb 03, 2025 at 06:22:13AM +0800, Mingli Zhang wrote: > > > Yes, I would like to provide a patch. > > > > > > Glad to see we have come to an agreement on this. > > > > Just adding my +1 here. FWIW. > Hi, > > Patch added. Add it to commitfest: https://commitfest.postgresql.org/52/5557 -- Zhang Mingli HashData
-
Re: Proposal to CREATE FOREIGN TABLE LIKE
Zhang Mingli <zmlpostgres@gmail.com> — 2025-02-07T16:50:47Z
On Feb 7, 2025 at 22:24 +0800, Zhang Mingli <zmlpostgres@gmail.com>, wrote: > On Feb 6, 2025 at 18:09 +0800, Zhang Mingli <zmlpostgres@gmail.com>, wrote: > > On Feb 3, 2025 at 08:29 +0800, Michael Paquier <michael@paquier.xyz>, wrote: > > > On Mon, Feb 03, 2025 at 06:22:13AM +0800, Mingli Zhang wrote: > > > > Yes, I would like to provide a patch. > > > > > > > > Glad to see we have come to an agreement on this. > > > > > > Just adding my +1 here. FWIW. > > Hi, > > > > Patch added. > > Add it to commitfest: https://commitfest.postgresql.org/52/5557 Fix CI failure of doc build in v1 patch. -- Zhang Mingli HashData
-
Re: Proposal to CREATE FOREIGN TABLE LIKE
Sami Imseih <samimseih@gmail.com> — 2025-02-08T04:55:23Z
> Fix CI failure of doc build in v1 patch. Thanks for the patch! I am +1 for this, but I have a few comments: 1/ In the IDENTITY case, the remote side may not be able to handle the DEFAULT value. See the example below: -- on the foreign server postgres=# CREATE TABLE t2 (id int, c1 text); CREATE TABLE -- on the local server postgres=# postgres=# CREATE TABLE t1 (id int GENERATED ALWAYS AS IDENTITY, c1 text); CREATE TABLE postgres=# CREATE FOREIGN TABLE t2 (LIKE t1 INCLUDING INDEXES) server r1; CREATE FOREIGN TABLE postgres=# INSERT INTO t2 (c1) VALUES ('A'); INSERT 0 1 postgres=# SELECT * FROM t2; id | c1 ----+---- | A (1 row) This is also the reason foreign tables don't document IDENTITY as valid [1]. It may even be a bug for it to be allowed with the CREATE FOREIGN TABLE syntax: postgres=# CREATE FOREIGN TABLE t3 (id int GENERATED ALWAYS AS IDENTITY, c1 text) server r1; CREATE FOREIGN TABLE postgres=# \d+ t3 Foreign table "public.t3" Column | Type | Collation | Nullable | Default | FDW options | Storage | Stats target | Description --------+---------+-----------+----------+------------------------------+-------------+----------+--------------+------------- id | integer | | not null | generated always as identity | | plain | | c1 | text | | | | | extended | | Not-null constraints: "t3_id_not_null" NOT NULL "id" Server: r1 2/ As IDENTITY, STORAGE is also allowed on foreign tables, which does not make much sense either, as the fdw may not be Postgres, or if it is Postgres, it may have a different STORAGE setting. This is also not documented. I am inclined to say to not include it either. I think we should not allow IDENTITY and STORAGE in this patch as they are not documented [1] as is, and perhaps a separate discussion to correct the behavior for the CREATE FOREIGN TABLE case. 3/ a minor nit on the comments. instead of + Foreign tables have no real storage in PostgreSQL. Can it just be Foreign tables have no storage in PostgreSQL. the "real" is not needed. [1] https://www.postgresql.org/docs/current/sql-createforeigntable.html -- Regards, Sami -
Re: Proposal to CREATE FOREIGN TABLE LIKE
Zhang Mingli <zmlpostgres@gmail.com> — 2025-02-09T13:16:53Z
On Feb 8, 2025 at 12:55 +0800, Sami Imseih <samimseih@gmail.com>, wrote: > > Fix CI failure of doc build in v1 patch. > > > > Thanks for the patch! I am +1 for this, but I have a few comments: Hi, tanks for review. > > > > 1/ In the IDENTITY case, the remote side may not be > > able to handle the DEFAULT value. Yes, and done. > > 2/ As IDENTITY, STORAGE is also allowed on foreign tables, which > > does not make much sense either, as the fdw may not be Postgres, > > or if it is Postgres, it may have a different STORAGE setting. This is > > also not documented. I am inclined to say to not include it either. Done. > > > > I think we should not allow IDENTITY and STORAGE in this patch > > as they are not documented [1] as is, and perhaps a separate discussion > > to correct the behavior for the CREATE FOREIGN TABLE case. Yes, however, I found we have doc to tell users and they actually could ALTER FOREIGN TABLE to SET STORAGE... There are several inconsistencies, I have a summary in Inconsistency between Compression and Storage for Foreign Tables[0] We could discuss and fix them there. > > > > 3/ a minor nit on the comments. > > > > instead of > > > > + Foreign tables have no real storage in PostgreSQL. > > > > Can it just be > > > > Foreign tables have no storage in PostgreSQL. > > > > the "real" is not needed. Done. Patch V2 addressed the comments. [0] https://www.postgresql.org/message-id/6cecef0e-ee14-473c-bb0a-6aa61f539a66%40Spark -- Zhang Mingli HashData
-
Re: Proposal to CREATE FOREIGN TABLE LIKE
Sami Imseih <samimseih@gmail.com> — 2025-02-11T00:14:14Z
> Patch V2 addressed the comments. Overall this LGTM. I still see a "no real storage" in v2 that should be removed from the documentation. + Foreign tables have no real storage in PostgreSQL. + Inapplicable options: <literal>INCLUDING INDEXES</literal>, <literal>INCLUDING STORAGE</literal>, I think the test coverage to check for the negative conditions only is enough. Regards, Sami
-
Re: Proposal to CREATE FOREIGN TABLE LIKE
Zhang Mingli <zmlpostgres@gmail.com> — 2025-02-11T14:49:24Z
On Feb 11, 2025 at 08:14 +0800, Sami Imseih <samimseih@gmail.com>, wrote: > > Patch V2 addressed the comments. > > > > Overall this LGTM. > > > > I still see a "no real storage" in v2 that should be removed > > from the documentation. > > > > + Foreign tables have no real storage in PostgreSQL. > > + Inapplicable options: <literal>INCLUDING INDEXES</literal>, > > <literal>INCLUDING STORAGE</literal>, Oh, I corrected another one in the code comments, but I forgot about this one. Done in patch v3. > > > I think the test coverage to check for the negative conditions only is > enough. Hmm... I copied from the cases in the same file for each option. There's no harm in having more tests, how about we keep them? -- Zhang Mingli HashData
-
Re: Proposal to CREATE FOREIGN TABLE LIKE
Sami Imseih <samimseih@gmail.com> — 2025-02-11T16:07:48Z
> + Foreign tables have no real storage in PostgreSQL. > + Inapplicable options: <literal>INCLUDING INDEXES</literal>, > <literal>INCLUDING STORAGE</literal>, > > Oh, I corrected another one in the code comments, but I forgot about this one. > Done in patch v3. I attached v4 with some slight modifications to the wording, otherwise this looks good. >> I think the test coverage to check for the negative conditions only is >> enough. >> >> > Hmm... I copied from the cases in the same file for each option. > There's no harm in having more tests, how about we keep them? I agree. I was just saying the test cases you provided are enough. No changes needed for the tests. I have no further comments. Regards, Sami
-
Re: Proposal to CREATE FOREIGN TABLE LIKE
Michael Paquier <michael@paquier.xyz> — 2025-02-17T07:23:56Z
On Tue, Feb 11, 2025 at 10:07:48AM -0600, Sami Imseih wrote: > I agree. I was just saying the test cases you provided are > enough. No changes needed for the tests. > > I have no further comments. The checks you are adding in the parse analysis of the LIKE clauses is surprisingly light. + * For foreign tables, they have no storage in Postgres. + * Inapplicable options are ignored. Wording is a bit strange here. + * CREATE_TABLE_LIKE_COMPRESSION + * CREATE_TABLE_LIKE_IDENTITY + * CREATE_TABLE_LIKE_STORAGE + * CREATE_TABLE_LIKE_INDEXES [...] +DROP FOREIGN TABLE ctl_foreign_table1; +DROP FOREIGN TABLE ctl_foreign_table2; +DROP FOREIGN TABLE ctl_foreign_table3; +DROP FOREIGN TABLE ctl_foreign_table4; +DROP FOREIGN TABLE ctl_foreign_table5; +DROP FOREIGN TABLE ctl_foreign_table6; What's the point of creating that many tables, one for each of the four INCLUDING options you are testing? It is possible to stack all of them in a single CREATE TABLE command, still is that really necessary if we have coverage with INCLUDING ALL and EXCLUDING ALL (perhaps write it directly in the CREATE query rather than assume that it is the default) as these are all-or-nothing switches for all the option values. Of course let's be careful with HIDE_TOAST_COMPRESSION if need be. Perhaps the original table should have a primary key, also to track the fact that the NOT NULL constraint is always copied but its related index is not? Identity columns assign a NOT NULL constraint, as documented these are always copied. Just wanted to point out that this works the same way for your implementation with foreign tables, so perhaps we should have a test for that. Glad to see that you did not forget about statistics. I didn't recall that these were OK for foreign tables, TBH. expandTableLikeClause() depends on the "constr" built in the first phase of transformTableLikeClause() to bypass the parts related to generated, default and constraints properties. This dependency between both routines should be documented, I guess. Hmm.. Not sure where. -- Michael
-
Re: Proposal to CREATE FOREIGN TABLE LIKE
Zhang Mingli <zmlpostgres@gmail.com> — 2025-02-17T11:14:59Z
On Feb 17, 2025 at 15:24 +0800, Michael Paquier <michael@paquier.xyz>, wrote: > > + * For foreign tables, they have no storage in Postgres. > + * Inapplicable options are ignored. > > Wording is a bit strange here. Hi, is this better? * Foreign tables do not store data in Postgres. * Any options that are not applicable for foreign tables will be ignored: > + * CREATE_TABLE_LIKE_COMPRESSION > + * CREATE_TABLE_LIKE_IDENTITY > + * CREATE_TABLE_LIKE_STORAGE > + * CREATE_TABLE_LIKE_INDEXES > [...] > +DROP FOREIGN TABLE ctl_foreign_table1; > +DROP FOREIGN TABLE ctl_foreign_table2; > +DROP FOREIGN TABLE ctl_foreign_table3; > +DROP FOREIGN TABLE ctl_foreign_table4; > +DROP FOREIGN TABLE ctl_foreign_table5; > +DROP FOREIGN TABLE ctl_foreign_table6; > > What's the point of creating that many tables, one for each of the > four INCLUDING options you are testing? It is possible to stack all > of them in a single CREATE TABLE command, still is that really > necessary if we have coverage with INCLUDING ALL and EXCLUDING ALL > (perhaps write it directly in the CREATE query rather than assume that > it is the default) as these are all-or-nothing switches for all the > option values. Of course let's be careful with HIDE_TOAST_COMPRESSION > if need be. I usually follow the cases within the same file; for each independent option, it becomes easier to identify which options are valid or invalid. However, if you believe consolidating them into one is better, I’m fine with that. Updated. > Perhaps the original table should have a primary key, also to track > the fact that the NOT NULL constraint is always copied but its related > index is not? Identity columns assign a NOT NULL constraint, as > documented these are always copied. Just wanted to point out that > this works the same way for your implementation with foreign tables, > so perhaps we should have a test for that. Done, although there is already one in column d. > > Glad to see that you did not forget about statistics. I didn't recall > that these were OK for foreign tables, TBH. I also didn't realize this until I wrote this patch. This could be useful for the planner? > expandTableLikeClause() depends on the "constr" built in the first > phase of transformTableLikeClause() to bypass the parts related to > generated, default and constraints properties. This dependency > between both routines should be documented, I guess. Hmm.. Not sure > where. Comments are addressed except for this one, it might be worth considering another patch. -- Zhang Mingli HashData
-
Re: Proposal to CREATE FOREIGN TABLE LIKE
Michael Paquier <michael@paquier.xyz> — 2025-02-18T00:49:22Z
On Mon, Feb 17, 2025 at 07:14:59PM +0800, Zhang Mingli wrote: > On Feb 17, 2025 at 15:24 +0800, Michael Paquier <michael@paquier.xyz>, wrote: >> + * For foreign tables, they have no storage in Postgres. >> + * Inapplicable options are ignored. >> >> Wording is a bit strange here. > > * Foreign tables do not store data in Postgres. > * Any options that are not applicable for foreign tables will be ignored: I would do something like that, perhaps, though I could get that people don't like this suggestion: "Some options are ignored. For example, as foreign tables have no storage, these options have no effect: storage, compression, identity and indexes. Similarly, INCLUDING INDEXES is ignored from a view." > I usually follow the cases within the same file; for each > independent option, it becomes easier to identify which options are > valid or invalid. However, if you believe consolidating them into > one is better, I’m fine with that. Updated. It does not matter much in this case, IMO, what matters is to make sure that the four additional checks you are adding in the post-parsing paths are correctly ignored. Passing down an INCLUDING ALL does that just fine as you double-check the state of the table with a \d+ meta-command. > I also didn't realize this until I wrote this patch. This could be > useful for the planner? Constraints can be used as hints in the planner when working on foreign tables. I'm pretty sure that this is the same reason here, seeing that this is supported since v10 where statistics have been introduced. I would need to dig more into the code, but that's not really the point for this thread.. >> expandTableLikeClause() depends on the "constr" built in the first >> phase of transformTableLikeClause() to bypass the parts related to >> generated, default and constraints properties. This dependency >> between both routines should be documented, I guess. Hmm.. Not sure >> where. > > Comments are addressed except for this one, it might be worth > considering another patch. Yeah, not entirely sure. It does not prevent your patch to work, and it is already documented that the "expand" part is done as-is because it depends on the "transform". So perhaps it's just OK like this. I withdraw my comment. + Inapplicable options: <literal>INCLUDING INDEXES</literal>, <literal>INCLUDING STORAGE</literal>, + <literal>INCLUDING COMPRESSION</literal>, <literal>INCLUDING IDENTITY</literal> are ignored. I would remove this paragraph, actually. The options supported are listed by your patch, and that would be one area less to update if a new INCLUDING flavor is added. Copy-pasting the details of how the LIKE options work to the create_foreign_table.sgml page is OK for me, and perhaps this will diverge a bit from the CREATE TABLE part. One thing is that LIKE is not part of the SQL specification for CREATE FOREIGN TABLE. Perhaps this should be mentioned at the bottom of the page under the "compatibility" section? -- Michael
-
Re: Proposal to CREATE FOREIGN TABLE LIKE
Zhang Mingli <zmlpostgres@gmail.com> — 2025-02-18T01:54:51Z
On Feb 18, 2025 at 08:49 +0800, Michael Paquier <michael@paquier.xyz>, wrote: > On Mon, Feb 17, 2025 at 07:14:59PM +0800, Zhang Mingli wrote: > > On Feb 17, 2025 at 15:24 +0800, Michael Paquier <michael@paquier.xyz>, wrote: > > > + * For foreign tables, they have no storage in Postgres. > > > + * Inapplicable options are ignored. > > > > > > Wording is a bit strange here. > > > > * Foreign tables do not store data in Postgres. > > * Any options that are not applicable for foreign tables will be ignored: > > I would do something like that, perhaps, though I could get that > people don't like this suggestion: > "Some options are ignored. For example, as foreign tables have no > storage, these options have no effect: storage, compression, identity > and indexes. Similarly, INCLUDING INDEXES is ignored from a view." OK. > > I also didn't realize this until I wrote this patch. This could be > > useful for the planner? > > Constraints can be used as hints in the planner when working on > foreign tables. I'm pretty sure that this is the same reason here, > seeing that this is supported since v10 where statistics have been > introduced. I would need to dig more into the code, but that's not > really the point for this thread.. Agree. > + Inapplicable options: <literal>INCLUDING INDEXES</literal>, <literal>INCLUDING STORAGE</literal>, > + <literal>INCLUDING COMPRESSION</literal>, <literal>INCLUDING IDENTITY</literal> are ignored. > > I would remove this paragraph, actually. The options supported are > listed by your patch, and that would be one area less to update if a > new INCLUDING flavor is added. OK. > > Copy-pasting the details of how the LIKE options work to the > create_foreign_table.sgml page is OK for me, and perhaps this will > diverge a bit from the CREATE TABLE part. One thing is that LIKE is > not part of the SQL specification for CREATE FOREIGN TABLE. Perhaps > this should be mentioned at the bottom of the page under the > "compatibility" section? Good point. Will address the comments later, thanks for review! -- Zhang Mingli HashData
-
Re: Proposal to CREATE FOREIGN TABLE LIKE
Zhang Mingli <zmlpostgres@gmail.com> — 2025-02-18T12:07:18Z
On Feb 18, 2025 at 09:54 +0800, Zhang Mingli <zmlpostgres@gmail.com>, wrote: > > Will address the comments later, thanks for review! Done in patch v6. -- Zhang Mingli HashData
-
Re: Proposal to CREATE FOREIGN TABLE LIKE
Zhang Mingli <zmlpostgres@gmail.com> — 2025-02-18T12:43:02Z
On Feb 18, 2025 at 09:54 +0800, Zhang Mingli <zmlpostgres@gmail.com>, wrote: > > Will address the comments later, thanks for review! Done in patch v6. -- Zhang Mingli HashData
-
Re: Proposal to CREATE FOREIGN TABLE LIKE
Michael Paquier <michael@paquier.xyz> — 2025-02-19T06:53:11Z
On Tue, Feb 18, 2025 at 08:43:02PM +0800, Zhang Mingli wrote: > On Feb 18, 2025 at 09:54 +0800, Zhang Mingli <zmlpostgres@gmail.com>, wrote: > > > > Will address the comments later, thanks for review! > > Done in patch v6. There was a hole in the tests for the option LIKE_STORAGE. Removing the check for it in transformTableLikeClause() did now show a diff in the tests. In the case of foreign tables, extended for storage is a correct choice when using a text type for an attribute. It makes more sense to use something like "main" on the origin table, then check that the foreign table uses "extended", for example. \d+ for a foreign table has no compression field, so using HIDE_TOAST_COMPRESSION has no meaning. Removing the check for the option LIKE_COMPRESSION leads to no diffs in the regression tests. The other two restrictions for indexes and identity were OK. The docs are fine after a closer look, relying mostly on the clauses supported by the CREATE FOREIGN TABLE command, tweaked a bit the part at the bottom where LIKE is not part of the standard. And applied. -- Michael
-
Re: Proposal to CREATE FOREIGN TABLE LIKE
Zhang Mingli <zmlpostgres@gmail.com> — 2025-02-19T07:40:56Z
On Feb 19, 2025 at 14:53 +0800, Michael Paquier <michael@paquier.xyz>, wrote: > There was a hole in the tests for the option LIKE_STORAGE. Removing > the check for it in transformTableLikeClause() did now show a diff in > the tests. In the case of foreign tables, extended for storage is a > correct choice when using a text type for an attribute. It makes more > sense to use something like "main" on the origin table, then check > that the foreign table uses "extended", for example. You're right. That was my mistake when I squashed the independent `like_options` cases into the two cases (`INCLUDING ALL`/`EXCLUDING ALL`) , particularly where there is an `ALTER STORAGE` before creating the foreign table, which shows the STORAGE difference. Thanks for the correction. > \d+ for a foreign table has no compression field, so using > HIDE_TOAST_COMPRESSION has no meaning. Removing the check for the > option LIKE_COMPRESSION leads to no diffs in the regression tests. > > The other two restrictions for indexes and identity were OK. > > The docs are fine after a closer look, relying mostly on the clauses > supported by the CREATE FOREIGN TABLE command, tweaked a bit the part > at the bottom where LIKE is not part of the standard. > > And applied. Thanks. -- Zhang Mingli HashData
-
Re: Proposal to CREATE FOREIGN TABLE LIKE
Michael Paquier <michael@paquier.xyz> — 2025-02-19T23:55:51Z
On Wed, Feb 19, 2025 at 03:40:56PM +0800, Zhang Mingli wrote: > Thanks for the correction. No problem. If you see anything else that you think is misleading, please feel free to ping me on this thread. -- Michael