update involving mod() func results in data corruption
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
Trafodion |
Fix Released
|
High
|
Anoop Sharma |
Bug Description
Table contains 1000 rows, primary key (integer, numeric(11,3)). Update of primary key int column using mod() function, returns "3 row(s) updated."; expected "1000 row(s) updated." Subsequent select [count(
>>-- integer primary key column
>>-- expect: 1000
>>SELECT COUNT(DISTINCT colintk) FROM f00;
(EXPR)
-------
--- 1 row(s) selected.
>>prepare XX from UPDATE f00 SET colintk = MOD(colintk, 100);
--- SQL command prepared.
>>-- expect: 1000 row(s) updated.
>>-- but instead get 3 row(s) updated???
>>execute XX;
--- 3 row(s) updated.
>>-- expect: 100
>>-- but instead get 999
>>SELECT COUNT(DISTINCT colintk) FROM f00;
(EXPR)
-------
--- 1 row(s) selected.
>>-- expect: 1000
>>-- but instead get 999
>>SELECT COUNT(*) FROM f00;
(EXPR)
-------
--- 1 row(s) selected.
To reproduce, see contents of attachment, updcorrupt.tar:
- obey file upd_pkey.sql or:
DROP TABLE f00;
CREATE TABLE f00(
;
UPSERT WITH NO ROLLBACK INTO f00 SELECT
from (values(1)) t
;
UPDATE STATISTICS FOR TABLE f00 ON EVERY COLUMN;
-- integer primary key column
-- expect: 1000
SELECT COUNT(DISTINCT colintk) FROM f00;
prepare XX from UPDATE f00 SET colintk = MOD(colintk, 100);
-- expect: 1000 row(s) updated.
-- but instead get 3 row(s) updated???
execute XX;
-- expect: 100
-- but instead get 999
SELECT COUNT(DISTINCT colintk) FROM f00;
-- expect: 1000
-- but instead get 999
SELECT COUNT(*) FROM f00;
Attached updcorrupt.tar also contains logs generated without/with explain output (see upd_pkey.
description: | updated |
Changed in trafodion: | |
assignee: | nobody → Anoop Sharma (anoop-sharma) |
Changed in trafodion: | |
status: | New → In Progress |
Changed in trafodion: | |
status: | In Progress → Fix Committed |
information type: | Proprietary → Public |
Verified on traf_0601:
colintk int not null,
colint int not null,
collint largeint not null,
colnum numeric(11,3) not null,
primary key (colintk, colnum))
c1+c2* 10+c3*100+ c4*1000+ c5*10000,
c1+c2* 10+c3*100+ c4*1000+ c5*10000,
(c1+ c2*10+c3* 100+c4* 1000+c5* 10000) + 549755813888,
cast( c1+c2*10+ c3*100+ c4*1000+ c5*10000 as numeric(11,3))
from (values(1)) t
transpose 0,1,2,3,4,5,6,7,8,9 as c1
transpose 0,1,2,3,4,5,6,7,8,9 as c2
transpose 0,1,2,3,4,5,6,7,8,9 as c3
--transpose 0,1,2,3,4,5,6,7,8,9 as c4
transpose 0 as c4
--transpose 0,1,2,3,4,5,6,7,8,9 as c5
transpose 0 as c5 >+>+>+> +>+>+>+ >+>+>
>>CREATE TABLE f00(
;
+>+>+>+>+>+>
--- SQL operation complete.
>>
>>UPSERT WITH NO ROLLBACK INTO f00 SELECT
;
+>+>+>+
--- 1000 row(s) inserted.
>>UPDATE STATISTICS FOR TABLE f00 ON EVERY COLUMN;
--- SQL operation complete.
>>SELECT COUNT(DISTINCT colintk) FROM f00;
(EXPR) ------- ------
-------
--- 1 row(s) selected.
>>prepare XX from UPDATE f00 SET colintk = MOD(colintk, 100);
--- SQL command prepared.
>>execute XX;
--- 1000 row(s) updated.
>>SELECT COUNT(DISTINCT colintk) FROM f00;
(EXPR) ------- ------
-------
--- 1 row(s) selected.
>>SELECT COUNT(*) FROM f00;
(EXPR) ------- ------
-------
--- 1 row(s) selected.