# 2011 May 17
#
# 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.
#
#***********************************************************************
#
# Test cases for the SQLITE4_ENABLE_8_3_NAMES feature that forces all
# filename extensions to be limited to 3 characters.  Some embedded
# systems need this to work around microsoft FAT patents, but this
# feature should be disabled on most deployments.
#

set testdir [file dirname $argv0]
source $testdir/tester.tcl
ifcapable !8_3_names {
  finish_test
  return
}

db close
sqlite4_shutdown
sqlite4_config_uri 1

do_test 8_3_names-1.0 {
  forcedelete test.db test.nal test.db-journal
  sqlite4 db test.db
  db eval {
    PRAGMA cache_size=10;
    CREATE TABLE t1(x);
    INSERT INTO t1 VALUES(randomblob(20000));
    BEGIN;
    DELETE FROM t1;
    INSERT INTO t1 VALUES(randomblob(15000));
  }
  file exists test.db-journal
} 1
do_test 8_3_names-1.1 {
  file exists test.nal
} 0
do_test 8_3_names-1.2 {
  db eval {
    ROLLBACK;
    SELECT length(x) FROM t1
  }
} 20000

db close
do_test 8_3_names-2.0 {
  forcedelete test.db test.nal test.db-journal
  sqlite4 db file:./test.db?8_3_names=1
  db eval {
    PRAGMA cache_size=10;
    CREATE TABLE t1(x);
    INSERT INTO t1 VALUES(randomblob(20000));
    BEGIN;
    DELETE FROM t1;
    INSERT INTO t1 VALUES(randomblob(15000));
  }
  file exists test.db-journal
} 0
do_test 8_3_names-2.1 {
  file exists test.nal
} 1
forcedelete test2.db test2.nal test2.db-journal
copy_file test.db test2.db
copy_file test.nal test2.nal
do_test 8_3_names-2.2 {
  db eval {
    COMMIT;
    SELECT length(x) FROM t1
  }
} 15000
do_test 8_3_names-2.3 {
  sqlite4 db2 file:./test2.db?8_3_names=1
  db2 eval {
    PRAGMA integrity_check;
    SELECT length(x) FROM t1;
  }
} {ok 20000}

db close
do_test 8_3_names-3.0 {
  forcedelete test.db test.nal test.db-journal
  sqlite4 db file:./test.db?8_3_names=0
  db eval {
    PRAGMA cache_size=10;
    CREATE TABLE t1(x);
    INSERT INTO t1 VALUES(randomblob(20000));
    BEGIN;
    DELETE FROM t1;
    INSERT INTO t1 VALUES(randomblob(15000));
  }
  file exists test.db-journal
} 1
do_test 8_3_names-3.1 {
  file exists test.nal
} 0
forcedelete test2.db test2.nal test2.db-journal
copy_file test.db test2.db
copy_file test.db-journal test2.db-journal
do_test 8_3_names-3.2 {
  db eval {
    COMMIT;
    SELECT length(x) FROM t1
  }
} 15000
do_test 8_3_names-3.3 {
  sqlite4 db2 file:./test2.db?8_3_names=0
  db2 eval {
    PRAGMA integrity_check;
    SELECT length(x) FROM t1;
  }
} {ok 20000}

##########################################################################
# Master journals.
#
db close
forcedelete test.db test2.db
do_test 8_3_names-4.0 {
  sqlite4 db file:./test.db?8_3_names=1
  db eval {
    CREATE TABLE t1(x);
    INSERT INTO t1 VALUES(1);
    ATTACH 'file:./test2.db?8_3_names=1' AS db2;
    CREATE TABLE db2.t2(y);
    INSERT INTO t2 VALUES(2);
    BEGIN;
      INSERT INTO t1 VALUES(3);
      INSERT INTO t2 VALUES(4);
    COMMIT;
    SELECT * FROM t1, t2 ORDER BY x, y
  }
} {1 2 1 4 3 2 3 4}
    

##########################################################################
# WAL mode.
#
ifcapable !wal {
  finish_test
  return
}
db close
forcedelete test.db
do_test 8_3_names-5.0 {
  sqlite4 db file:./test.db?8_3_names=1
  register_wholenumber_module db
  db eval {
    PRAGMA journal_mode=WAL;
    CREATE TABLE t1(x);
    CREATE VIRTUAL TABLE nums USING wholenumber;
    INSERT INTO t1 SELECT value FROM nums WHERE value BETWEEN 1 AND 1000;
    BEGIN;
    UPDATE t1 SET x=x*2;
  }
  sqlite4 db2 file:./test.db?8_3_names=1
  register_wholenumber_module db2
  db2 eval {
    BEGIN;
    SELECT sum(x) FROM t1;
  }
} {500500}

do_test 8_3_names-5.1 {
  file exists test.db-wal
} 0
do_test 8_3_names-5.2 {
  file exists test.wal
} 1
do_test 8_3_names-5.3 {
  file exists test.db-shm
} 0
do_test 8_3_names-5.4 {
  file exists test.shm
} 1


do_test 8_3_names-5.5 {
  db eval {
    COMMIT;
    SELECT sum(x) FROM t1;
  }
} {1001000}
do_test 8_3_names-5.6 {
  db2 eval {
    SELECT sum(x) FROM t1;
  }
} {500500}


finish_test
