# 2015 July 25
#
# 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 that an RBU data_xxx table may be a view instead of a regular
# table.
#

if {![info exists testdir]} {
  set testdir [file join [file dirname [info script]] .. .. test]
}
source $testdir/tester.tcl
source $testdir/lock_common.tcl
set ::testprefix rbu14


foreach {tn schema} {
  1 {
    CREATE TABLE t1(a PRIMARY KEY, b, c);
    CREATE TABLE t2(a PRIMARY KEY, b, c);
  }
  2 {
    CREATE TABLE t1(a PRIMARY KEY, b, c);
    CREATE TABLE t2(a PRIMARY KEY, b, c);
    CREATE INDEX i1 ON t1(b, c);
    CREATE INDEX i2 ON t2(b, c);
  }
  3 {
    CREATE TABLE t1(a PRIMARY KEY, b, c) WITHOUT ROWID;
    CREATE TABLE t2(a PRIMARY KEY, b, c) WITHOUT ROWID;
  }
  4 {
    CREATE TABLE t1(a PRIMARY KEY, b, c) WITHOUT ROWID;
    CREATE TABLE t2(a PRIMARY KEY, b, c) WITHOUT ROWID;
    CREATE INDEX i1 ON t1(b, c);
    CREATE INDEX i2 ON t2(b, c);
  }
} {
  reset_db

  execsql $schema
  execsql {
    INSERT INTO t1 VALUES(50, 50, 50);
    INSERT INTO t1 VALUES(51, 51, 51);
    INSERT INTO t2 VALUES(50, 50, 50);
    INSERT INTO t2 VALUES(51, 51, 51);
  }

  forcedelete rbu.db
  do_execsql_test $tn.1 {
    ATTACH 'rbu.db' AS rbu;
    CREATE TABLE rbu.stuff(tbl, a, b, c, rbu_control);
    INSERT INTO stuff VALUES
      ('t1', 1, 2, 3, 0),                   -- insert into t1
      ('t2', 4, 5, 6, 0),                   -- insert into t2
      ('t1', 50, NULL, NULL, 1),            -- delete from t1
      ('t2', 51, NULL, NULL, 1);            -- delete from t2

    CREATE VIEW rbu.data_t1 AS 
    SELECT a, b, c, rbu_control FROM stuff WHERE tbl='t1';
    CREATE VIEW rbu.data_t2 AS 
    SELECT a, b, c, rbu_control FROM stuff WHERE tbl='t2';
  }

  do_test $tn.2 {
    while 1 {
      sqlite3rbu rbu test.db rbu.db
      set rc [rbu step]
      rbu close
      if {$rc != "SQLITE_OK"} break
    }
    set rc
  } {SQLITE_DONE}

  do_execsql_test $tn.3.1 {
    SELECT * FROM t1 ORDER BY a;
  } {1 2 3 51 51 51}

  do_execsql_test $tn.3.2 {
    SELECT * FROM t2 ORDER BY a;
  } {4 5 6 50 50 50}

  integrity_check $tn.4
}


finish_test

