4 ** The author disclaims copyright to this source code. In place of
5 ** a legal notice, here is a blessing:
7 ** May you do good and not evil.
8 ** May you find forgiveness for yourself and forgive others.
9 ** May you share freely, never taking more than you give.
11 *************************************************************************
17 ** The test in this file attempts to expose a specific race condition
18 ** that is suspected to exist at time of writing.
21 static char *lookaside1_thread_reader(int iTid
, void *pArg
){
22 Error err
= {0}; /* Error code and message */
23 Sqlite db
= {0}; /* SQLite database connection */
25 opendb(&err
, &db
, "test.db", 0);
27 while( !timetostop(&err
) ){
28 sqlite3_stmt
*pStmt
= 0;
31 sqlite3_prepare_v2(db
.db
, "SELECT 1 FROM t1", -1, &pStmt
, 0);
32 while( sqlite3_step(pStmt
)==SQLITE_ROW
){
33 execsql(&err
, &db
, "SELECT length(x||y||z) FROM t2");
35 rc
= sqlite3_finalize(pStmt
);
36 if( err
.rc
==SQLITE_OK
&& rc
!=SQLITE_OK
){
37 sqlite_error(&err
, &db
, "finalize");
42 print_and_free_err(&err
);
43 return sqlite3_mprintf("ok");
46 static char *lookaside1_thread_writer(int iTid
, void *pArg
){
47 Error err
= {0}; /* Error code and message */
48 Sqlite db
= {0}; /* SQLite database connection */
50 opendb(&err
, &db
, "test.db", 0);
55 "UPDATE t3 SET i=i+1 WHERE x=1;"
58 }while( !timetostop(&err
) );
61 print_and_free_err(&err
);
62 return sqlite3_mprintf("ok");
66 static void lookaside1(int nMs
){
69 Threadset threads
= {0};
71 opendb(&err
, &db
, "test.db", 1);
73 "CREATE TABLE t1(x PRIMARY KEY) WITHOUT ROWID;"
75 " SELECT 1, quote(randomblob(750)) UNION ALL "
76 " SELECT x*2, y||y FROM data WHERE x<5) "
77 "INSERT INTO t1 SELECT y FROM data;"
79 "CREATE TABLE t3(x PRIMARY KEY,i) WITHOUT ROWID;"
80 "INSERT INTO t3 VALUES(1, 1);"
82 "CREATE TABLE t2(x,y,z);"
83 "INSERT INTO t2 VALUES(randomblob(50), randomblob(50), randomblob(50));"
87 setstoptime(&err
, nMs
);
89 sqlite3_enable_shared_cache(1);
90 launch_thread(&err
, &threads
, lookaside1_thread_reader
, 0);
91 launch_thread(&err
, &threads
, lookaside1_thread_reader
, 0);
92 launch_thread(&err
, &threads
, lookaside1_thread_reader
, 0);
93 launch_thread(&err
, &threads
, lookaside1_thread_reader
, 0);
94 launch_thread(&err
, &threads
, lookaside1_thread_reader
, 0);
95 launch_thread(&err
, &threads
, lookaside1_thread_writer
, 0);
96 join_all_threads(&err
, &threads
);
97 sqlite3_enable_shared_cache(0);
98 print_and_free_err(&err
);