Re: Attribute of type record has wrong type error with MERGE ... WHEN NOT MATCHED BY SOURCE THEN DELETE

Поиск
Список
Период
Сортировка
От Tender Wang
Тема Re: Attribute of type record has wrong type error with MERGE ... WHEN NOT MATCHED BY SOURCE THEN DELETE
Дата
Msg-id CAHewXNmuO70GHqZev500b9cGXRbHzU9cDsn2tMWqhv6bXWJ5qQ@mail.gmail.com
обсуждение исходный текст
Ответ на Attribute of type record has wrong type error with MERGE ... WHEN NOT MATCHED BY SOURCE THEN DELETE  (Duncan Sands <duncan.sands@deepbluecap.com>)
Ответы Re: Attribute of type record has wrong type error with MERGE ... WHEN NOT MATCHED BY SOURCE THEN DELETE
Re: Attribute of type record has wrong type error with MERGE ... WHEN NOT MATCHED BY SOURCE THEN DELETE
Список pgsql-bugs


Duncan Sands <duncan.sands@deepbluecap.com> 于2025年3月10日周一 18:43写道:
Postgresql version 17.4 (Ubuntu 17.4-1.pgdg24.10+2) on x86_64-pc-linux-gnu

To reproduce, execute the statements in the attached file cr.sql.  I get:

duncan=> \i cr.sql
CREATE TABLE
CREATE TABLE
CREATE VIEW
CREATE TABLE
COPY 1
COPY 2
COPY 1
psql:cr.sql:42: ERROR:  attribute 2 of type record has wrong type
DETAIL:  Table has type _country_or_region, but query expects record.

I attribute it to the "WHEN NOT MATCHED BY SOURCE THEN DELETE" part of the MERGE
as it doesn't happen if that part is left off.

When the query has NOT MATCHED BY SOURCE, commit d7d297f84 add "src IS NOT NULL" join condition.
In this case, the src is view(e.g. subquery), so in makeWholeRowVar(), it will call below code:
result = makeVar(varno,
                      InvalidAttrNumber,
                      RECORDOID,
                      -1,
                      InvalidOid,
                      varlevelsup);

the vartype is RECORDOID, but te reltype of src is not RECORDOID, so $SUBJECT error reports.

I add the below codes to makeWholeRowVar() default branch:

if (rte->relkind == RELKIND_VIEW)
        toid = get_rel_type_id(rte->relid);
else
        toid = RECORDOID;

It can work.  


--
Thanks,
Tender Wang

В списке pgsql-bugs по дате отправления: