[
https://issues.apache.org/jira/browse/HIVE-30126?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Denys Kuzmenko updated HIVE-30126:
----------------------------------
Summary: Iceberg: Copy-On-Write MERGE skips the cardinality check, so a
target row matched by several source rows is written several times (was:
Iceberg: copy-on-write MERGE skips the cardinality check, so a target row
matched by several source rows is written several times)
> Iceberg: Copy-On-Write MERGE skips the cardinality check, so a target row
> matched by several source rows is written several times
> ---------------------------------------------------------------------------------------------------------------------------------
>
> Key: HIVE-30126
> URL: https://issues.apache.org/jira/browse/HIVE-30126
> Project: Hive
> Issue Type: Bug
> Reporter: Denys Kuzmenko
> Priority: Major
>
> MergeRewriter adds a cardinality check when
> hive.merge.cardinality.check=true, the default. The query fails if more than
> one source row matches the same target row in a WHEN MATCHED UPDATE or
> DELETE, as SQL:2011 (ISO/IEC 9075-2, 14.2) requires. Merge-on-read MERGE
> (SplitMergeRewriter) inherits the check. CopyOnWriteMergeRewriter.rewrite
> does not add it:
> // TODO: handleCardinalityViolation;
>
>
> So a copy-on-write MERGE with duplicate source keys succeeds and writes one
> updated copy of the target row per matching source row.
> *Repro: *
> {code}
>
>
> create table tgt (id int, v int) stored by iceberg
>
>
> tblproperties ('format-version'='2', 'write.merge.mode'='copy-on-write');
>
>
> insert into tgt values (1, 10), (2, 20);
>
>
> create table src (id int, v int);
>
>
> insert into src values (1, 100), (1, 200);
>
>
>
>
>
> merge into tgt t using src s on t.id = s.id
>
>
> when matched then update set v = s.v;
>
>
>
>
>
> select * from tgt order by id, v;
>
>
> -- merge-on-read: fails with a cardinality violation
>
>
> -- copy-on-write: succeeds, returns (1,100), (1,200), (2,20); the target
> row is duplicated
> {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
