# 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) }
} {}

finish_test
