mirror of
				https://github.com/sqlite/sqlite.git
				synced 2025-11-03 16:53:36 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			108 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
# 2016 March 31
 | 
						|
#
 | 
						|
# 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.
 | 
						|
#
 | 
						|
#***********************************************************************
 | 
						|
#
 | 
						|
# The focus of this file is testing the session module.
 | 
						|
#
 | 
						|
 | 
						|
if {![info exists testdir]} {
 | 
						|
  set testdir [file join [file dirname [info script]] .. .. test]
 | 
						|
} 
 | 
						|
source [file join [file dirname [info script]] session_common.tcl]
 | 
						|
source $testdir/tester.tcl
 | 
						|
ifcapable !session {finish_test; return}
 | 
						|
set testprefix sessionfault2
 | 
						|
 | 
						|
do_execsql_test 1.0.0 {
 | 
						|
  CREATE TABLE t1(a PRIMARY KEY, b UNIQUE);
 | 
						|
  INSERT INTO t1 VALUES(1, 1);
 | 
						|
  INSERT INTO t1 VALUES(2, 2);
 | 
						|
  INSERT INTO t1 VALUES(3, 3);
 | 
						|
 | 
						|
  CREATE TABLE t2(a PRIMARY KEY, b UNIQUE);
 | 
						|
  INSERT INTO t2 VALUES(1, 1);
 | 
						|
  INSERT INTO t2 VALUES(2, 2);
 | 
						|
  INSERT INTO t2 VALUES(3, 3);
 | 
						|
}
 | 
						|
faultsim_save_and_close
 | 
						|
 | 
						|
faultsim_restore_and_reopen
 | 
						|
do_test 1.0.1 {
 | 
						|
  set ::C [changeset_from_sql {
 | 
						|
    UPDATE t1 SET b=4 WHERE a=3;
 | 
						|
    UPDATE t1 SET b=3 WHERE a=2;
 | 
						|
    UPDATE t1 SET b=2 WHERE a=1;
 | 
						|
    UPDATE t2 SET b=0 WHERE a=1;
 | 
						|
    UPDATE t2 SET b=1 WHERE a=2;
 | 
						|
    UPDATE t2 SET b=2 WHERE a=3;
 | 
						|
  }]
 | 
						|
  set {} {}
 | 
						|
} {}
 | 
						|
 | 
						|
proc xConflict args { return "OMIT" }
 | 
						|
 | 
						|
do_faultsim_test 1 -faults oom-p* -prep {
 | 
						|
  faultsim_restore_and_reopen
 | 
						|
} -body {
 | 
						|
  sqlite3changeset_apply db $::C xConflict
 | 
						|
} -test {
 | 
						|
  faultsim_test_result {0 {}} {1 SQLITE_NOMEM}
 | 
						|
  faultsim_integrity_check
 | 
						|
 | 
						|
  catch { db eval ROLLBACK }
 | 
						|
  set res [db eval {
 | 
						|
    SELECT * FROM t1;
 | 
						|
    SELECT * FROM t2;
 | 
						|
  }]
 | 
						|
 | 
						|
  if {$testrc==0} {
 | 
						|
    if {$res != "1 2 2 3 3 4 1 0 2 1 3 2"} { error "data error" }
 | 
						|
  } else {
 | 
						|
    if {
 | 
						|
         $res != "1 2 2 3 3 4 1 0 2 1 3 2"
 | 
						|
      && $res != "1 1 2 2 3 3 1 1 2 2 3 3"
 | 
						|
    } { error "data error!! $res" }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
#-------------------------------------------------------------------------
 | 
						|
# OOM when applying a changeset for which one of the tables has a name
 | 
						|
# 99 bytes in size. This happens to cause an extra malloc in within the
 | 
						|
# sessions_strm permutation.
 | 
						|
#
 | 
						|
reset_db
 | 
						|
set nm [string repeat t 99]
 | 
						|
do_execsql_test 2.0.0 [string map "%TBL% $nm" {
 | 
						|
  CREATE TABLE %TBL%(a PRIMARY KEY, b UNIQUE);
 | 
						|
}]
 | 
						|
faultsim_save_and_close
 | 
						|
 | 
						|
faultsim_restore_and_reopen
 | 
						|
do_test 1.0.1 {
 | 
						|
  set ::C [changeset_from_sql [string map "%TBL% $nm" {
 | 
						|
    INSERT INTO %TBL% VALUES(1, 2);
 | 
						|
    INSERT INTO %TBL% VALUES(3, 4);
 | 
						|
  }]]
 | 
						|
  set {} {}
 | 
						|
} {}
 | 
						|
 | 
						|
proc xConflict args { return "OMIT" }
 | 
						|
do_faultsim_test 2 -faults oom-p* -prep {
 | 
						|
  faultsim_restore_and_reopen
 | 
						|
} -body {
 | 
						|
  sqlite3changeset_apply db $::C xConflict
 | 
						|
} -test {
 | 
						|
  faultsim_test_result {0 {}} {1 SQLITE_NOMEM}
 | 
						|
  faultsim_integrity_check
 | 
						|
}
 | 
						|
 | 
						|
finish_test
 | 
						|
 |