[ 
https://issues.apache.org/jira/browse/TRAFODION-1254?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14715454#comment-14715454
 ] 

Suresh Subbiah commented on TRAFODION-1254:
-------------------------------------------

This change was merged today with this commit.
https://github.com/apache/incubator-trafodion/commit/5928f31a1e20c70a528101487def3db0ef0ade9c

> LP Bug: 1460771 - UPSERT with indexes can cause inconsistent index
> ------------------------------------------------------------------
>
>                 Key: TRAFODION-1254
>                 URL: https://issues.apache.org/jira/browse/TRAFODION-1254
>             Project: Apache Trafodion
>          Issue Type: Bug
>          Components: sql-cmp
>            Reporter: Hans Zeller
>            Assignee: Suresh Subbiah
>            Priority: Critical
>             Fix For: 2.0-incubating
>
>
> When we do UPSERT statements, some of the rows we insert are new and some may 
> overwrite already existing rows. In the index maintenance tree, we need to 
> insert a new index row for both cases, but we also need to delete any 
> existing index rows. Right now this is not happening, and it partially 
> defeats the whole idea of upsert, which is mostly used to avoid the more 
> expensive check and put operation.
> This bug affects UPSERT INTO <table> and also the new index maintenance 
> method introduced in changes https://review.trafodion.org/#/c/1694/ and 
> https://review.trafodion.org/#/c/1705/. It does not affect the UPSERT USING 
> LOAD method that recreates the indexes instead of incrementally maintaining 
> them.
> Here is a test case:
> -- create a simple table with an index
> create table upsertx(id int not null, a int, b int,
>                           primary key (id));
> create index ix1 on upsertx(a);
> -- insert 10,000 unique rows
> prepare s from
> upsert into upsertx
> select num, num+10000, num+10000
> from (select 1000*e3 + 100*e2 + 10*e1 + e0
>       from (values (0)) seed(s)
>       transpose 0,1,2,3,4,5,6,7,8,9 as e0
>       transpose 0,1,2,3,4,5,6,7,8,9 as e1
>       transpose 0,1,2,3,4,5,6,7,8,9 as e2
>       transpose 0,1,2,3,4,5,6,7,8,9 as e3) t(num);
> explain options 'f' s;
> execute s;
> -- now insert 100 duplicate rows
> prepare s from
> upsert into upsertx
> select 100*num, 100*num+20000, 100*num+20000
> from (select 10*e1 + e0
>       from (values (0)) seed(s)
>       transpose 0,1,2,3,4,5,6,7,8,9 as e0
>       transpose 0,1,2,3,4,5,6,7,8,9 as e1) t(num);
> explain options 'f' s;
> execute s;
> -- table has 10,000 rows in it
> select count(*) from upsertx;
> -- the index has 10,100 rows!!
> set parserflags 1;
> select count(*) from table(index_table IX1);
> -- show some of the duplicate rows in the index
> select * from table(index_table IX1)
> where id in (100, 101, 200, 201)
> order by id;



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to