| # 2012 March 23 |
| # |
| # The author disclaims copyright to this source code. In place of |
| # a legal notice, here is a blessing: |
| # |
| # May you do good and not evil. |
| # May you find forgiveness for yourself and forgive others. |
| # May you share freely, never taking more than you give. |
| # |
| #*********************************************************************** |
| # |
| # |
| set testdir [file dirname $argv0] |
| source $testdir/tester.tcl |
| ifcapable {!incrblob} { finish_test ; return } |
| set testprefix incrblob4 |
| |
| proc create_t1 {} { |
| execsql { |
| PRAGMA page_size = 1024; |
| CREATE TABLE t1(k INTEGER PRIMARY KEY, v); |
| } |
| } |
| |
| proc populate_t1 {} { |
| set data [list a b c d e f g h i j k l m n o p q r s t u v w x y z] |
| foreach d $data { |
| set blob [string repeat $d 900] |
| execsql { INSERT INTO t1(v) VALUES($blob) } |
| } |
| } |
| |
| |
| do_test 1.1 { |
| create_t1 |
| populate_t1 |
| } {} |
| |
| do_test 1.2 { |
| set blob [db incrblob t1 v 5] |
| read $blob 10 |
| } {eeeeeeeeee} |
| |
| do_test 1.3 { |
| execsql { DELETE FROM t1 } |
| populate_t1 |
| } {} |
| |
| |
| |
| do_test 2.1 { |
| reset_db |
| create_t1 |
| populate_t1 |
| } {} |
| |
| do_test 2.2 { |
| set blob [db incrblob t1 v 10] |
| read $blob 10 |
| } {jjjjjjjjjj} |
| |
| do_test 2.3 { |
| set new [string repeat % 900] |
| execsql { DELETE FROM t1 WHERE k=10 } |
| execsql { DELETE FROM t1 WHERE k=9 } |
| execsql { INSERT INTO t1(v) VALUES($new) } |
| } {} |
| |
| |
| |
| do_test 3.1 { |
| reset_db |
| create_t1 |
| populate_t1 |
| } {} |
| |
| do_test 3.2 { |
| set blob [db incrblob t1 v 20] |
| read $blob 10 |
| } {tttttttttt} |
| |
| do_test 3.3 { |
| set new [string repeat % 900] |
| execsql { UPDATE t1 SET v = $new WHERE k = 20 } |
| execsql { DELETE FROM t1 WHERE k=19 } |
| execsql { INSERT INTO t1(v) VALUES($new) } |
| } {} |
| |
| #------------------------------------------------------------------------- |
| # Test that it is not possible to DROP a table with an incremental blob |
| # cursor open on it. |
| # |
| do_execsql_test 4.1 { |
| CREATE TABLE t2(a INTEGER PRIMARY KEY, b); |
| INSERT INTO t2 VALUES(456, '0123456789'); |
| } |
| do_test 4.2 { |
| set blob [db incrblob -readonly t2 b 456] |
| read $blob 5 |
| } {01234} |
| do_catchsql_test 4.3 { |
| DROP TABLE t2 |
| } {1 {database table is locked}} |
| do_test 4.4 { |
| sqlite3_extended_errcode db |
| } {SQLITE_LOCKED} |
| close $blob |
| |
| finish_test |