Re: in BeginCopyTo make materialized view using COPY TO instead of COPY (query). - Mailing list pgsql-hackers

From Fujii Masao
Subject Re: in BeginCopyTo make materialized view using COPY TO instead of COPY (query).
Date
Msg-id 4f9481ea-5dbc-43b2-a8a1-ec4cbecce6e7@oss.nttdata.com
Whole thread Raw
In response to Re: in BeginCopyTo make materialized view using COPY TO instead of COPY (query).  (jian he <jian.universality@gmail.com>)
Responses Re: in BeginCopyTo make materialized view using COPY TO instead of COPY (query).
List pgsql-hackers

On 2025/04/01 12:12, jian he wrote:
> On Mon, Mar 31, 2025 at 11:27 PM Fujii Masao
> <masao.fujii@oss.nttdata.com> wrote:
>>
>> Regarding the patch, here are some review comments:
>>
>> +                                               errmsg("cannot copy from materialized view when the materialized
viewis not populated"),
 
>>
>> How about including the object name for consistency with
>> other error messages in BeginCopyTo(), like this?
>>
>>          errmsg("cannot copy from unpopulated materialized view \"%s\"",
>>                     RelationGetRelationName(rel)),
>>
>>
>> +                                               errhint("Use the REFRESH MATERIALIZED VIEW command populate the
materializedview first."));
 
>>
>> There seems to be a missing "to" just after "command".
>> Should it be "Use the REFRESH MATERIALIZED VIEW command to
>> populate the materialized view first."? Or we could simplify
>> the hint to match what SELECT on an unpopulated materialized
>> view logs: "Use the REFRESH MATERIALIZED VIEW command.".
>>
> based on your suggestion, i changed it to:

Thanks for updating the patch!

> 
>              if (!RelationIsPopulated(rel))
>                  ereport(ERROR,
>                          errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
>                          errmsg("cannot copy from unpopulated
> materialized view \"%s\"",
>                                      RelationGetRelationName(rel)),
>                          errhint("Use the REFRESH MATERIALIZED VIEW
> command to populate the materialized view first."));

I think it's better to use the same hint message as the one output by
"COPY (SELECT * FROM <unpopulated matview>) TO",
specifically: "Use the REFRESH MATERIALIZED VIEW command," for consistency.


>> The copy.sgml documentation should clarify that COPY TO can
>> be used with a materialized view only if it is populated.
>>
> "COPY TO can be used only with plain tables, not views, and does not
> copy rows from child tables or child partitions"
> i changed it to
> "COPY TO can be used with plain tables and materialized views, not
> regular views, and does not copy rows from child tables or child
> partitions"

It would be clearer to specify that "COPY TO" applies to *populated*
materialized views rather than just "materialized views"?


> Another alternative wording I came up with:
> "COPY TO can only be used with plain tables and materialized views,
> not regular views. It also does not copy rows from child tables or
> child partitions."

If we split the first description into two as you suggested,
I'm tempted to propose the following improvements to enhance
the overall descriptions:

-------------
"COPY TO" can be used with plain tables and populated materialized views. For example, "COPY table TO" copies the same
rowsas "SELECT * FROM ONLY table." However, it doesn't directly support other relation types, such as partitioned
tables,inheritance child tables, or views. To copy all rows from these relations, use "COPY (SELECT * FROM table) TO."
 
-------------


>> Wouldn't it be beneficial to add a regression test to check
>> whether COPY matview TO works as expected?
> sure.

The tests seem to have been placed under the category "COPY FROM ... DEFAULT",
which feels a bit misaligned. How about adding them to the end of copy.sql instead?

Regards,

-- 
Fujii Masao
Advanced Computing Technology Center
Research and Development Headquarters
NTT DATA CORPORATION




pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: bug when apply fast default mechanism for adding new column over domain with default value
Next
From: Andres Freund
Date:
Subject: BTScanOpaqueData size slows down tests