Add new "dynamic_triggers" test case to threadtest3.c.

FossilOrigin-Name: a4691563dd2b3e5e8474467b0c5c46fb26351b77
This commit is contained in:
dan 2010-10-28 15:52:04 +00:00
parent 2b359bdbe4
commit ec03364911
3 changed files with 131 additions and 7 deletions

View File

@ -1,5 +1,5 @@
C Enforce\sthe\sMAX_EXPR_DEPTH\slimit\swhile\sbuilding\sexpression\strees\sduring\sSQL\sparsing.
D 2010-10-28T11:31:23
C Add\snew\s"dynamic_triggers"\stest\scase\sto\sthreadtest3.c.
D 2010-10-28T15:52:05
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in 2c8cefd962eca0147132c7cf9eaa4bb24c656f3f
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@ -662,7 +662,7 @@ F test/thread2.test e08034b83fe9693ade77049732518e5b3d2d700d
F test/thread_common.tcl 2aa6f2fdcd4d6e461169c3e5ca098eebf643b863
F test/threadtest1.c 6029d9c5567db28e6dc908a0c63099c3ba6c383b
F test/threadtest2.c ace893054fa134af3fc8d6e7cfecddb8e3acefb9
F test/threadtest3.c 58df1e3c060f534fd7fb0702331b0acc41c381d8
F test/threadtest3.c d6d209190c7110f9a7e6a8154bdc3260efdbf8b7
F test/tkt-02a8e81d44.test 58494de77be2cf249228ada3f313fa399821c6ab
F test/tkt-26ff0c2d1e.test 888324e751512972c6e0d1a09df740d8f5aaf660
F test/tkt-2ea2425d34.test 1cf13e6f75d149b3209a0cb32927a82d3d79fb28
@ -880,7 +880,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
P 739b5d9aa4eaa4191ca512d0dbf94a6bdbb12d97
R 7d13c78e61246d2ffda39eef845308b8
P 2625eee0cb7f22dba61459b689e33a03ecebb6da
R 72ae68a6bead35074543f0fbb3f99813
U dan
Z 089b9ce90fd6493612af9b7c95a2cded
Z d97641c607fcd38b195631c16e5de58c

View File

@ -1 +1 @@
2625eee0cb7f22dba61459b689e33a03ecebb6da
a4691563dd2b3e5e8474467b0c5c46fb26351b77

View File

@ -1272,6 +1272,129 @@ static void cgt_pager_1(int nMs){
print_and_free_err(&err);
}
/*------------------------------------------------------------------------
** Test case "dynamic_triggers"
**
** Two threads executing statements that cause deeply nested triggers
** to fire. And one thread busily creating and deleting triggers. This
** is an attempt to find a bug reported to us.
*/
static char *dynamic_triggers_1(int iTid, int iArg){
Error err = {0}; /* Error code and message */
Sqlite db = {0}; /* SQLite database connection */
int nDrop = 0;
int nCreate = 0;
opendb(&err, &db, "test.db", 0);
while( !timetostop(&err) ){
int i;
for(i=1; i<9; i++){
char *zSql = sqlite3_mprintf(
"CREATE TRIGGER itr%d BEFORE INSERT ON t%d BEGIN "
"INSERT INTO t%d VALUES(new.x, new.y);"
"END;", i, i, i+1
);
execsql(&err, &db, zSql);
sqlite3_free(zSql);
nCreate++;
}
for(i=1; i<9; i++){
char *zSql = sqlite3_mprintf(
"CREATE TRIGGER dtr%d BEFORE DELETE ON t%d BEGIN "
"DELETE FROM t%d WHERE x = old.x; "
"END;", i, i, i+1
);
execsql(&err, &db, zSql);
sqlite3_free(zSql);
nCreate++;
}
for(i=1; i<9; i++){
char *zSql = sqlite3_mprintf("DROP TRIGGER itr%d", i);
execsql(&err, &db, zSql);
sqlite3_free(zSql);
nDrop++;
}
for(i=1; i<9; i++){
char *zSql = sqlite3_mprintf("DROP TRIGGER dtr%d", i);
execsql(&err, &db, zSql);
sqlite3_free(zSql);
nDrop++;
}
}
print_and_free_err(&err);
return sqlite3_mprintf("%d created, %d dropped", nCreate, nDrop);
}
static char *dynamic_triggers_2(int iTid, int iArg){
Error err = {0}; /* Error code and message */
Sqlite db = {0}; /* SQLite database connection */
i64 iVal = 0;
int nInsert = 0;
int nDelete = 0;
opendb(&err, &db, "test.db", 0);
while( !timetostop(&err) ){
do {
iVal = (iVal+1)%100;
execsql(&err, &db, "INSERT INTO t1 VALUES(:iX, :iY+1)", &iVal, &iVal);
nInsert++;
} while( iVal );
do {
iVal = (iVal+1)%100;
execsql(&err, &db, "DELETE FROM t1 WHERE x = :iX", &iVal);
nDelete++;
} while( iVal );
}
print_and_free_err(&err);
return sqlite3_mprintf("%d inserts, %d deletes", nInsert, nDelete);
}
static void dynamic_triggers(int nMs){
Error err = {0};
Sqlite db = {0};
Threadset threads = {0};
opendb(&err, &db, "test.db", 1);
sql_script(&err, &db,
"PRAGMA page_size = 1024;"
"PRAGMA journal_mode = WAL;"
"CREATE TABLE t1(x, y);"
"CREATE TABLE t2(x, y);"
"CREATE TABLE t3(x, y);"
"CREATE TABLE t4(x, y);"
"CREATE TABLE t5(x, y);"
"CREATE TABLE t6(x, y);"
"CREATE TABLE t7(x, y);"
"CREATE TABLE t8(x, y);"
"CREATE TABLE t9(x, y);"
);
setstoptime(&err, nMs);
sqlite3_enable_shared_cache(1);
launch_thread(&err, &threads, dynamic_triggers_2, 0);
launch_thread(&err, &threads, dynamic_triggers_2, 0);
sqlite3_enable_shared_cache(0);
sleep(2);
launch_thread(&err, &threads, dynamic_triggers_2, 0);
launch_thread(&err, &threads, dynamic_triggers_1, 0);
join_all_threads(&err, &threads);
print_and_free_err(&err);
}
int main(int argc, char **argv){
struct ThreadTest {
void (*xTest)(int);
@ -1286,6 +1409,7 @@ int main(int argc, char **argv){
{ walthread5, "walthread5", 1000 },
{ cgt_pager_1, "cgt_pager_1", 0 },
{ dynamic_triggers, "dynamic_triggers", 20000 },
};
int i;