1*1da57d55SToomas Soome#
27c478bd9Sstevel@tonic-gate# The author disclaims copyright to this source code.  In place of
37c478bd9Sstevel@tonic-gate# a legal notice, here is a blessing:
47c478bd9Sstevel@tonic-gate#
57c478bd9Sstevel@tonic-gate#    May you do good and not evil.
67c478bd9Sstevel@tonic-gate#    May you find forgiveness for yourself and forgive others.
77c478bd9Sstevel@tonic-gate#    May you share freely, never taking more than you give.
87c478bd9Sstevel@tonic-gate#
97c478bd9Sstevel@tonic-gate#***********************************************************************
107c478bd9Sstevel@tonic-gate#
117c478bd9Sstevel@tonic-gate# Tests to make sure that value returned by last_statement_change_count()
127c478bd9Sstevel@tonic-gate# (LSCC) is updated properly, especially inside triggers
137c478bd9Sstevel@tonic-gate#
147c478bd9Sstevel@tonic-gate# Note 1: LSCC remains constant within a statement and only updates once
157c478bd9Sstevel@tonic-gate#           the statement is finished (triggers count as part of statement)
167c478bd9Sstevel@tonic-gate# Note 2: LSCC is changed within the context of a trigger
177c478bd9Sstevel@tonic-gate#           much like last_insert_rowid() (see lastinsert.test),
187c478bd9Sstevel@tonic-gate#           but is restored once the trigger exits
197c478bd9Sstevel@tonic-gate# Note 3: LSCC is not changed by a change to a view (since everything
207c478bd9Sstevel@tonic-gate#           is done within instead of trigger context)
217c478bd9Sstevel@tonic-gate#
227c478bd9Sstevel@tonic-gate
237c478bd9Sstevel@tonic-gateset testdir [file dirname $argv0]
247c478bd9Sstevel@tonic-gatesource $testdir/tester.tcl
257c478bd9Sstevel@tonic-gate
267c478bd9Sstevel@tonic-gate# ----------------------------------------------------------------------------
277c478bd9Sstevel@tonic-gate# 1.x - basic tests (no triggers)
287c478bd9Sstevel@tonic-gate
297c478bd9Sstevel@tonic-gate# LSCC set properly after insert
307c478bd9Sstevel@tonic-gatedo_test laststmtchanges-1.1 {
317c478bd9Sstevel@tonic-gate    catchsql {
327c478bd9Sstevel@tonic-gate        create table t0 (x);
337c478bd9Sstevel@tonic-gate        insert into t0 values (1);
347c478bd9Sstevel@tonic-gate        insert into t0 values (1);
357c478bd9Sstevel@tonic-gate        insert into t0 values (2);
367c478bd9Sstevel@tonic-gate        insert into t0 values (2);
377c478bd9Sstevel@tonic-gate        insert into t0 values (1);
387c478bd9Sstevel@tonic-gate        insert into t0 values (1);
397c478bd9Sstevel@tonic-gate        insert into t0 values (1);
407c478bd9Sstevel@tonic-gate        insert into t0 values (2);
417c478bd9Sstevel@tonic-gate        select last_statement_change_count();
427c478bd9Sstevel@tonic-gate    }
437c478bd9Sstevel@tonic-gate} {0 1}
447c478bd9Sstevel@tonic-gate
457c478bd9Sstevel@tonic-gate# LSCC set properly after update
467c478bd9Sstevel@tonic-gatedo_test laststmtchanges-1.2 {
477c478bd9Sstevel@tonic-gate    catchsql {
487c478bd9Sstevel@tonic-gate        update t0 set x=3 where x=1;
497c478bd9Sstevel@tonic-gate        select last_statement_change_count();
507c478bd9Sstevel@tonic-gate    }
517c478bd9Sstevel@tonic-gate} {0 5}
527c478bd9Sstevel@tonic-gate
537c478bd9Sstevel@tonic-gate# LSCC unchanged within an update statement
547c478bd9Sstevel@tonic-gatedo_test laststmtchanges-1.3 {
557c478bd9Sstevel@tonic-gate    catchsql {
567c478bd9Sstevel@tonic-gate        update t0 set x=x+last_statement_change_count() where x=3;
577c478bd9Sstevel@tonic-gate        select count() from t0 where x=8;
587c478bd9Sstevel@tonic-gate    }
597c478bd9Sstevel@tonic-gate} {0 5}
607c478bd9Sstevel@tonic-gate
617c478bd9Sstevel@tonic-gate# LSCC set properly after update on table where no rows changed
627c478bd9Sstevel@tonic-gatedo_test laststmtchanges-1.4 {
637c478bd9Sstevel@tonic-gate    catchsql {
647c478bd9Sstevel@tonic-gate        update t0 set x=77 where x=88;
657c478bd9Sstevel@tonic-gate        select last_statement_change_count();
667c478bd9Sstevel@tonic-gate    }
677c478bd9Sstevel@tonic-gate} {0 0}
687c478bd9Sstevel@tonic-gate
697c478bd9Sstevel@tonic-gate# LSCC set properly after delete from table
707c478bd9Sstevel@tonic-gatedo_test laststmtchanges-1.5 {
717c478bd9Sstevel@tonic-gate    catchsql {
727c478bd9Sstevel@tonic-gate        delete from t0 where x=2;
737c478bd9Sstevel@tonic-gate        select last_statement_change_count();
747c478bd9Sstevel@tonic-gate    }
757c478bd9Sstevel@tonic-gate} {0 3}
767c478bd9Sstevel@tonic-gate
777c478bd9Sstevel@tonic-gate# ----------------------------------------------------------------------------
787c478bd9Sstevel@tonic-gate# 2.x - tests with after insert trigger
797c478bd9Sstevel@tonic-gate
807c478bd9Sstevel@tonic-gate# LSCC changed properly after insert into table containing after trigger
817c478bd9Sstevel@tonic-gatedo_test laststmtchanges-2.1 {
827c478bd9Sstevel@tonic-gate    catchsql {
837c478bd9Sstevel@tonic-gate        create table t1 (k integer primary key);
847c478bd9Sstevel@tonic-gate        create table t2 (k integer primary key, v1, v2);
857c478bd9Sstevel@tonic-gate        create trigger r1 after insert on t1 for each row begin
867c478bd9Sstevel@tonic-gate            insert into t2 values (NULL, last_statement_change_count(), NULL);
877c478bd9Sstevel@tonic-gate            update t0 set x=x;
887c478bd9Sstevel@tonic-gate            update t2 set v2=last_statement_change_count();
897c478bd9Sstevel@tonic-gate        end;
907c478bd9Sstevel@tonic-gate        insert into t1 values (77);
917c478bd9Sstevel@tonic-gate        select last_statement_change_count();
927c478bd9Sstevel@tonic-gate    }
937c478bd9Sstevel@tonic-gate} {0 1}
947c478bd9Sstevel@tonic-gate
957c478bd9Sstevel@tonic-gate# LSCC unchanged upon entry into after insert trigger
967c478bd9Sstevel@tonic-gatedo_test laststmtchanges-2.2 {
977c478bd9Sstevel@tonic-gate    catchsql {
987c478bd9Sstevel@tonic-gate        select v1 from t2;
997c478bd9Sstevel@tonic-gate    }
1007c478bd9Sstevel@tonic-gate} {0 3}
1017c478bd9Sstevel@tonic-gate
1027c478bd9Sstevel@tonic-gate# LSCC changed properly by update within context of after insert trigger
1037c478bd9Sstevel@tonic-gatedo_test laststmtchanges-2.3 {
1047c478bd9Sstevel@tonic-gate    catchsql {
1057c478bd9Sstevel@tonic-gate        select v2 from t2;
1067c478bd9Sstevel@tonic-gate    }
1077c478bd9Sstevel@tonic-gate} {0 5}
1087c478bd9Sstevel@tonic-gate
1097c478bd9Sstevel@tonic-gate# ----------------------------------------------------------------------------
1107c478bd9Sstevel@tonic-gate# 3.x - tests with after update trigger
1117c478bd9Sstevel@tonic-gate
1127c478bd9Sstevel@tonic-gate# LSCC changed properly after update into table containing after trigger
1137c478bd9Sstevel@tonic-gatedo_test laststmtchanges-3.1 {
1147c478bd9Sstevel@tonic-gate    catchsql {
1157c478bd9Sstevel@tonic-gate        drop trigger r1;
1167c478bd9Sstevel@tonic-gate        delete from t2; delete from t2;
1177c478bd9Sstevel@tonic-gate        create trigger r1 after update on t1 for each row begin
1187c478bd9Sstevel@tonic-gate            insert into t2 values (NULL, last_statement_change_count(), NULL);
1197c478bd9Sstevel@tonic-gate            delete from t0 where oid=1 or oid=2;
1207c478bd9Sstevel@tonic-gate            update t2 set v2=last_statement_change_count();
1217c478bd9Sstevel@tonic-gate        end;
1227c478bd9Sstevel@tonic-gate        update t1 set k=k;
1237c478bd9Sstevel@tonic-gate        select last_statement_change_count();
1247c478bd9Sstevel@tonic-gate    }
1257c478bd9Sstevel@tonic-gate} {0 1}
1267c478bd9Sstevel@tonic-gate
1277c478bd9Sstevel@tonic-gate# LSCC unchanged upon entry into after update trigger
1287c478bd9Sstevel@tonic-gatedo_test laststmtchanges-3.2 {
1297c478bd9Sstevel@tonic-gate    catchsql {
1307c478bd9Sstevel@tonic-gate        select v1 from t2;
1317c478bd9Sstevel@tonic-gate    }
1327c478bd9Sstevel@tonic-gate} {0 0}
1337c478bd9Sstevel@tonic-gate
1347c478bd9Sstevel@tonic-gate# LSCC changed properly by delete within context of after update trigger
1357c478bd9Sstevel@tonic-gatedo_test laststmtchanges-3.3 {
1367c478bd9Sstevel@tonic-gate    catchsql {
1377c478bd9Sstevel@tonic-gate        select v2 from t2;
1387c478bd9Sstevel@tonic-gate    }
1397c478bd9Sstevel@tonic-gate} {0 2}
1407c478bd9Sstevel@tonic-gate
1417c478bd9Sstevel@tonic-gate# ----------------------------------------------------------------------------
1427c478bd9Sstevel@tonic-gate# 4.x - tests with before delete trigger
1437c478bd9Sstevel@tonic-gate
1447c478bd9Sstevel@tonic-gate# LSCC changed properly on delete from table containing before trigger
1457c478bd9Sstevel@tonic-gatedo_test laststmtchanges-4.1 {
1467c478bd9Sstevel@tonic-gate    catchsql {
1477c478bd9Sstevel@tonic-gate        drop trigger r1;
1487c478bd9Sstevel@tonic-gate        delete from t2; delete from t2;
1497c478bd9Sstevel@tonic-gate        create trigger r1 before delete on t1 for each row begin
1507c478bd9Sstevel@tonic-gate            insert into t2 values (NULL, last_statement_change_count(), NULL);
1517c478bd9Sstevel@tonic-gate            insert into t0 values (5);
1527c478bd9Sstevel@tonic-gate            update t2 set v2=last_statement_change_count();
1537c478bd9Sstevel@tonic-gate        end;
1547c478bd9Sstevel@tonic-gate        delete from t1;
1557c478bd9Sstevel@tonic-gate        select last_statement_change_count();
1567c478bd9Sstevel@tonic-gate    }
1577c478bd9Sstevel@tonic-gate} {0 1}
1587c478bd9Sstevel@tonic-gate
1597c478bd9Sstevel@tonic-gate# LSCC unchanged upon entry into before delete trigger
1607c478bd9Sstevel@tonic-gatedo_test laststmtchanges-4.2 {
1617c478bd9Sstevel@tonic-gate    catchsql {
1627c478bd9Sstevel@tonic-gate        select v1 from t2;
1637c478bd9Sstevel@tonic-gate    }
1647c478bd9Sstevel@tonic-gate} {0 0}
1657c478bd9Sstevel@tonic-gate
1667c478bd9Sstevel@tonic-gate# LSCC changed properly by insert within context of before delete trigger
1677c478bd9Sstevel@tonic-gatedo_test laststmtchanges-4.3 {
1687c478bd9Sstevel@tonic-gate    catchsql {
1697c478bd9Sstevel@tonic-gate        select v2 from t2;
1707c478bd9Sstevel@tonic-gate    }
1717c478bd9Sstevel@tonic-gate} {0 1}
1727c478bd9Sstevel@tonic-gate
1737c478bd9Sstevel@tonic-gate# ----------------------------------------------------------------------------
1747c478bd9Sstevel@tonic-gate# 5.x - complex tests with temporary tables and nested instead of triggers
1757c478bd9Sstevel@tonic-gate
1767c478bd9Sstevel@tonic-gatedo_test laststmtchanges-5.1 {
1777c478bd9Sstevel@tonic-gate    catchsql {
1787c478bd9Sstevel@tonic-gate        drop table t0; drop table t1; drop table t2;
1797c478bd9Sstevel@tonic-gate        create temp table t0(x);
1807c478bd9Sstevel@tonic-gate        create temp table t1 (k integer primary key);
1817c478bd9Sstevel@tonic-gate        create temp table t2 (k integer primary key);
1827c478bd9Sstevel@tonic-gate        create temp view v1 as select * from t1;
1837c478bd9Sstevel@tonic-gate        create temp view v2 as select * from t2;
1847c478bd9Sstevel@tonic-gate        create temp table n1 (k integer primary key, n);
1857c478bd9Sstevel@tonic-gate        create temp table n2 (k integer primary key, n);
1867c478bd9Sstevel@tonic-gate        insert into t0 values (1);
1877c478bd9Sstevel@tonic-gate        insert into t0 values (2);
1887c478bd9Sstevel@tonic-gate        insert into t0 values (1);
1897c478bd9Sstevel@tonic-gate        insert into t0 values (1);
1907c478bd9Sstevel@tonic-gate        insert into t0 values (1);
1917c478bd9Sstevel@tonic-gate        insert into t0 values (2);
1927c478bd9Sstevel@tonic-gate        insert into t0 values (2);
1937c478bd9Sstevel@tonic-gate        insert into t0 values (1);
1947c478bd9Sstevel@tonic-gate        create temp trigger r1 instead of insert on v1 for each row begin
1957c478bd9Sstevel@tonic-gate            insert into n1 values (NULL, last_statement_change_count());
1967c478bd9Sstevel@tonic-gate            update t0 set x=x*10 where x=1;
1977c478bd9Sstevel@tonic-gate            insert into n1 values (NULL, last_statement_change_count());
1987c478bd9Sstevel@tonic-gate            insert into t1 values (NEW.k);
1997c478bd9Sstevel@tonic-gate            insert into n1 values (NULL, last_statement_change_count());
2007c478bd9Sstevel@tonic-gate            update t0 set x=x*10 where x=0;
2017c478bd9Sstevel@tonic-gate            insert into v2 values (100+NEW.k);
2027c478bd9Sstevel@tonic-gate            insert into n1 values (NULL, last_statement_change_count());
2037c478bd9Sstevel@tonic-gate        end;
2047c478bd9Sstevel@tonic-gate        create temp trigger r2 instead of insert on v2 for each row begin
2057c478bd9Sstevel@tonic-gate            insert into n2 values (NULL, last_statement_change_count());
2067c478bd9Sstevel@tonic-gate            insert into t2 values (1000+NEW.k);
2077c478bd9Sstevel@tonic-gate            insert into n2 values (NULL, last_statement_change_count());
2087c478bd9Sstevel@tonic-gate            update t0 set x=x*100 where x=0;
2097c478bd9Sstevel@tonic-gate            insert into n2 values (NULL, last_statement_change_count());
2107c478bd9Sstevel@tonic-gate            delete from t0 where x=2;
2117c478bd9Sstevel@tonic-gate            insert into n2 values (NULL, last_statement_change_count());
2127c478bd9Sstevel@tonic-gate        end;
2137c478bd9Sstevel@tonic-gate        insert into t1 values (77);
2147c478bd9Sstevel@tonic-gate        select last_statement_change_count();
2157c478bd9Sstevel@tonic-gate    }
2167c478bd9Sstevel@tonic-gate} {0 1}
2177c478bd9Sstevel@tonic-gate
2187c478bd9Sstevel@tonic-gatedo_test laststmtchanges-5.2 {
2197c478bd9Sstevel@tonic-gate    catchsql {
2207c478bd9Sstevel@tonic-gate        delete from t1 where k=88;
2217c478bd9Sstevel@tonic-gate        select last_statement_change_count();
2227c478bd9Sstevel@tonic-gate    }
2237c478bd9Sstevel@tonic-gate} {0 0}
2247c478bd9Sstevel@tonic-gate
2257c478bd9Sstevel@tonic-gatedo_test laststmtchanges-5.3 {
2267c478bd9Sstevel@tonic-gate    catchsql {
2277c478bd9Sstevel@tonic-gate        insert into v1 values (5);
2287c478bd9Sstevel@tonic-gate        select last_statement_change_count();
2297c478bd9Sstevel@tonic-gate    }
2307c478bd9Sstevel@tonic-gate} {0 0}
2317c478bd9Sstevel@tonic-gate
2327c478bd9Sstevel@tonic-gatedo_test laststmtchanges-5.4 {
2337c478bd9Sstevel@tonic-gate    catchsql {
2347c478bd9Sstevel@tonic-gate        select n from n1;
2357c478bd9Sstevel@tonic-gate    }
2367c478bd9Sstevel@tonic-gate} {0 {0 5 1 0}}
2377c478bd9Sstevel@tonic-gate
2387c478bd9Sstevel@tonic-gatedo_test laststmtchanges-5.5 {
2397c478bd9Sstevel@tonic-gate    catchsql {
2407c478bd9Sstevel@tonic-gate        select n from n2;
2417c478bd9Sstevel@tonic-gate    }
2427c478bd9Sstevel@tonic-gate} {0 {0 1 0 3}}
2437c478bd9Sstevel@tonic-gate
2447c478bd9Sstevel@tonic-gatefinish_test
2457c478bd9Sstevel@tonic-gate
246