/**************************************************************************************/
/* File:        demo03                                                                */
/* Project:     ATSQL2 : CREATE TABLE, INSERT, DELETE, UPDATE                         */
/* Author:      Andreas Steiner                                                       */
/* Date:        22-06-1995                                                            */
/* Results:                                                                           */
/**************************************************************************************/

SET CALENDRIC SYSTEM fiscal;

CREATE TABLE p(X integer) AS VALID;
CREATE TABLE s(X integer, Y integer) AS VALID;

NONSEQUENCED VALID PERIOD '1981-1985' INSERT INTO p VALUES (1);
NONSEQUENCED VALID PERIOD '1983-1987' INSERT INTO p VALUES (1);
NONSEQUENCED VALID PERIOD '1983-1987' INSERT INTO p VALUES (2);
NONSEQUENCED VALID PERIOD '1982-1988' INSERT INTO p VALUES (3);

NONSEQUENCED VALID PERIOD '1982-1984' INSERT INTO s VALUES (3, 3);


CREATE TABLE test1 AS
  NONSEQUENCED VALID
     SELECT *
     FROM   p;
 
CREATE TABLE test2(A) AS
  NONSEQUENCED VALID
     SELECT *
     FROM   p;
  

CREATE TABLE test3 AS
  VALID
     SELECT *
     FROM   p 
AS VALID;


CREATE TABLE test4(A) AS
  VALID
     SELECT *
     FROM   p 
AS VALID;


CREATE TABLE test5 AS
  NONSEQUENCED VALID PERIOD 'beginning-forever' 
    (SELECT *
     FROM   p
    INTERSECT
     SELECT X
     FROM   s)
AS VALID;


CREATE TABLE test6(A) AS
  NONSEQUENCED VALID PERIOD 'beginning-forever' 
    (SELECT *
     FROM   p
    INTERSECT
     SELECT X
     FROM   s)
AS VALID;


DROP TABLE p;
DROP TABLE s;

DROP TABLE test1;
DROP TABLE test2;
DROP TABLE test3;
DROP TABLE test4;
DROP TABLE test5;
DROP TABLE test6;


/* Data : */
/* ------ */ 

CREATE TABLE p(X integer, int period) AS VALID;

NONSEQUENCED VALID PERIOD '1991-1995' INSERT INTO p VALUES (1, PERIOD '1990-1992');
NONSEQUENCED VALID PERIOD '1993-1997' INSERT INTO p VALUES (1, PERIOD '1990-1992');
NONSEQUENCED VALID PERIOD '1993-1997' INSERT INTO p VALUES (2, PERIOD '1990-1992');
NONSEQUENCED VALID PERIOD '1992-1998' INSERT INTO p VALUES (3, PERIOD '1990-1992');

VALID
  (SELECT * FROM p) (PERIOD);

/*
       VALID x         int
 ----------- - -----------
 [1993-1997) 2 [1990-1992)
 [1992-1998) 3 [1990-1992)
 [1991-1997) 1 [1990-1992)
*/



/* CREATE, INSERT : */
/* ================ */

CREATE TABLE test AS
	VALID
	   SELECT * 
  	   FROM   p
AS TRANSACTION;

CREATE TABLE test AS
	TRANSACTION
	   SELECT * 
	   FROM   p
AS VALID;

CREATE TABLE test AS
	VALID AND TRANSACTION
	   SELECT * 
	   FROM   p
AS TRANSACTION;

CREATE TABLE test AS
	VALID AND TRANSACTION
	   SELECT * 
	   FROM   p
AS VALID;

/*
Error: query temporally incompatible with table/view
*/


/* Snapshot Relation : */
/* ------------------- */

CREATE TABLE test1(A integer, I period);

NONSEQUENCED VALID
	INSERT INTO test1 
  	  SELECT * 
  	  FROM p;

CREATE TABLE test2 AS
	NONSEQUENCED VALID SELECT * FROM p;

CREATE TABLE test3(A, B) AS
	NONSEQUENCED VALID SELECT *  FROM p;

NONSEQUENCED VALID SELECT * FROM test1;
NONSEQUENCED VALID SELECT * FROM test2;
NONSEQUENCED VALID SELECT * FROM test3;


DROP TABLE test1;
DROP TABLE test2;
DROP TABLE test3;

/*
               x                                          int
 --------------- --------------------------------------------
               1                                [1990 - 1992)
               1                                [1990 - 1992)
               2                                [1990 - 1992)
               3                                [1990 - 1992)
*/


/* Valid Relation : */
/* ---------------- */

CREATE TABLE test1(A integer, I period) AS VALID;

VALID 
  INSERT INTO test1
	  SELECT * 
 	  FROM p;


CREATE TABLE test2 AS
	VALID SELECT * FROM p 
AS VALID;


CREATE TABLE test3(A, I) AS
	VALID SELECT * FROM p
AS VALID;


VALID (SELECT * FROM test1) (PERIOD);
VALID (SELECT * FROM test2) (PERIOD);
VALID (SELECT * FROM test3) (PERIOD);

/*
       VALID a           i
 ----------- - -----------
 [1993-1997) 2 [1990-1992)
 [1992-1998) 3 [1990-1992)
 [1991-1997) 1 [1990-1992)
*/

DROP TABLE test1;
DROP TABLE test2;
DROP TABLE test3;



/* System Relation : */
/* ----------------- */

SET CLOCK TO TIMESTAMP '1995/01/01';

CREATE TABLE test1(A integer, I period) AS TRANSACTION;

NONSEQUENCED VALID
	INSERT INTO test1 
	SELECT * 
	FROM p;


CREATE TABLE test2 AS
	NONSEQUENCED VALID SELECT * FROM p
AS TRANSACTION;


CREATE TABLE test3(A, I) AS
	NONSEQUENCED VALID SELECT * FROM p
AS TRANSACTION;


TRANSACTION SELECT * FROM test1;
TRANSACTION SELECT * FROM test2;
TRANSACTION SELECT * FROM test3;

/*
    TRANSACTION a           i
 -------------- - -----------
 [1995-forever) 1 [1990-1992)
 [1995-forever) 1 [1990-1992)
 [1995-forever) 2 [1990-1992)
 [1995-forever) 3 [1990-1992)
*/

DROP TABLE test1;
DROP TABLE test2;
DROP TABLE test3;



/* Bitemporal Relation : */
/* --------------------- */

SET CLOCK TO TIMESTAMP '1995/01/01';

CREATE TABLE test1(A integer, I period) AS VALID AND TRANSACTION;

VALID
  INSERT INTO test1
	SELECT * 
	FROM   p;


CREATE TABLE test2 AS
	VALID SELECT * FROM p 
AS VALID AND TRANSACTION;


CREATE TABLE test3(A, I) AS
	VALID SELECT * FROM p 
AS TRANSACTION AND VALID;


VALID AND TRANSACTION SELECT * FROM test1;
VALID AND TRANSACTION SELECT * FROM test2;
VALID AND TRANSACTION SELECT * FROM test3;

/*
    TRANSACTION       VALID a           i
 -------------- ----------- - -----------
 [1995-forever) [1991-1995) 1 [1990-1992)
 [1995-forever) [1993-1997) 1 [1990-1992)
 [1995-forever) [1993-1997) 2 [1990-1992)
 [1995-forever) [1992-1998) 3 [1990-1992)
*/


DROP TABLE test1;
DROP TABLE test2;
DROP TABLE test3;

DROP TABLE p;

REMOVE CLOCK;



/* DELETE : */
/* ======== */

/* Type 1 : */
/* -------- */

CREATE TABLE p(X integer) AS VALID;
CREATE TABLE q(X integer) AS VALID;

NONSEQUENCED VALID PERIOD '1991-1995' INSERT INTO p VALUES (1);
NONSEQUENCED VALID PERIOD '1993-1997' INSERT INTO p VALUES (1);
NONSEQUENCED VALID PERIOD '1993-1997' INSERT INTO p VALUES (2);
NONSEQUENCED VALID PERIOD '1992-1998' INSERT INTO p VALUES (3);

NONSEQUENCED VALID PERIOD '1993-1995' INSERT INTO q VALUES (1);
NONSEQUENCED VALID PERIOD '1997-2000' INSERT INTO q VALUES (3);


NONSEQUENCED VALID PERIOD '1994-1996' 
  DELETE FROM p 
  WHERE NOT EXISTS (SELECT *
                    FROM   q
	            WHERE  p.X = q.X);

VALID SELECT * FROM p;

/*
                                        VALID               x
 -------------------------------------------- ---------------
                                [1991 - 1995)               1
                                [1993 - 1997)               1
                                [1992 - 1998)               3
                                [1993 - 1994)               2
                                [1996 - 1997)               2
*/

DROP TABLE p;
DROP TABLE q;


/* Type 2 : */
/* -------- */

CREATE TABLE p(X integer) AS VALID;
CREATE TABLE q(X integer) AS VALID;

NONSEQUENCED VALID PERIOD '1991-1995' INSERT INTO p VALUES (1);
NONSEQUENCED VALID PERIOD '1993-1997' INSERT INTO p VALUES (1);
NONSEQUENCED VALID PERIOD '1993-1997' INSERT INTO p VALUES (2);
NONSEQUENCED VALID PERIOD '1992-1998' INSERT INTO p VALUES (3);

NONSEQUENCED VALID PERIOD '1993-1995' INSERT INTO q VALUES (1);
NONSEQUENCED VALID PERIOD '1997-2000' INSERT INTO q VALUES (3);


NONSEQUENCED VALID 
  DELETE FROM p 
  WHERE NOT EXISTS (SELECT *
                    FROM   q
	            WHERE  p.X = q.X);

VALID SELECT * FROM p;

/*
                                        VALID               x
 -------------------------------------------- ---------------
                                [1991 - 1995)               1
                                [1993 - 1997)               1
                                [1992 - 1998)               3
*/

DROP TABLE p;
DROP TABLE q;


/* Type 3 : */
/* -------- */

CREATE TABLE p(X integer) AS VALID;
CREATE TABLE q(X integer) AS VALID;

NONSEQUENCED VALID PERIOD '1991-1995' INSERT INTO p VALUES (1);
NONSEQUENCED VALID PERIOD '1993-1997' INSERT INTO p VALUES (1);
NONSEQUENCED VALID PERIOD '1993-1997' INSERT INTO p VALUES (2);
NONSEQUENCED VALID PERIOD '1992-1998' INSERT INTO p VALUES (3);

NONSEQUENCED VALID PERIOD '1993-1995' INSERT INTO q VALUES (1);
NONSEQUENCED VALID PERIOD '1997-2000' INSERT INTO q VALUES (3);


VALID
  DELETE FROM p 
  WHERE NOT EXISTS (SELECT *
                    FROM   q
	            WHERE  p.X = q.X);

VALID SELECT * FROM p;

/*
                                        VALID               x
 -------------------------------------------- ---------------
                                [1993 - 1995)               1
                                [1993 - 1995)               1
                                [1997 - 1998)               3
*/

DROP TABLE p;
DROP TABLE q;



/* System Relation : */
/* ----------------- */

SET CLOCK TO TIMESTAMP '1995/6/12~12:30';

CREATE TABLE p(X integer) AS TRANSACTION;
CREATE TABLE q(X integer) AS TRANSACTION;

NONSEQUENCED VALID INSERT INTO p VALUES (1);
NONSEQUENCED VALID INSERT INTO p VALUES (1);
NONSEQUENCED VALID INSERT INTO p VALUES (2);
NONSEQUENCED VALID INSERT INTO p VALUES (3);

NONSEQUENCED VALID INSERT INTO q VALUES (1);
NONSEQUENCED VALID INSERT INTO q VALUES (3);

COMMIT;


SET CLOCK TO TIMESTAMP '1995/6/13';

/* Type 1: */
/* ------- */

NONSEQUENCED VALID PERIOD '1994-1996'
  DELETE FROM p 
  WHERE NOT EXISTS (SELECT *
                    FROM   q
	            WHERE  p.X = q.X);

/*
Error: query temporally incompatible with table/view
*/


/* Type 2: */
/* ------- */

NONSEQUENCED VALID
  DELETE FROM p 
  WHERE NOT EXISTS (SELECT *
                    FROM   q
	            WHERE  p.X = q.X);


NONSEQUENCED TRANSACTION
	SELECT TRANSACTION(p), * FROM p;

/*
                               transaction(p)               x
 -------------------------------------------- ---------------
                 [1995/06/12~12:30 - forever)               1
                 [1995/06/12~12:30 - forever)               1
                 [1995/06/12~12:30 - forever)               3
              [1995/06/12~12:30 - 1995/06/13)               2
*/


/* Type 3: */
/* ------- */

VALID 
  DELETE FROM p 
  WHERE NOT EXISTS (SELECT *
                    FROM   q
	            WHERE  p.X = q.X);

/*
Error: query temporally incompatible with table/view
*/


DROP TABLE p;
DROP TABLE q;


/* Bitemporale Relation : */
/* ---------------------- */

/* Type 1: */
/* ------- */

SET CLOCK TO TIMESTAMP '1995/6/12~12:30';

CREATE TABLE p(X integer) AS VALID AND TRANSACTION;
CREATE TABLE q(X integer) AS VALID AND TRANSACTION;

NONSEQUENCED VALID PERIOD '1991-1995' INSERT INTO p VALUES (1);
NONSEQUENCED VALID PERIOD '1993-1997' INSERT INTO p VALUES (1);
NONSEQUENCED VALID PERIOD '1993-1997' INSERT INTO p VALUES (2);
NONSEQUENCED VALID PERIOD '1992-1998' INSERT INTO p VALUES (3);

NONSEQUENCED VALID PERIOD '1993-1995' INSERT INTO q VALUES (1);
NONSEQUENCED VALID PERIOD '1997-2000' INSERT INTO q VALUES (3);

COMMIT;


SET CLOCK TO TIMESTAMP '1995/6/13';

NONSEQUENCED VALID PERIOD '1994-1996'
  DELETE FROM p 
  WHERE NOT EXISTS (SELECT *
                    FROM   q
	            WHERE  p.X = q.X);

VALID AND NONSEQUENCED TRANSACTION
	SELECT TRANSACTION(p), VALID(p), * FROM p;

/*
                                        VALID                               transaction(p)                                     valid(p)               x
 -------------------------------------------- -------------------------------------------- -------------------------------------------- ---------------
                                [1991 - 1995)                 [1995/06/12~12:30 - forever)                                [1991 - 1995)               1
                                [1993 - 1997)                 [1995/06/12~12:30 - forever)                                [1993 - 1997)               1
                                [1992 - 1998)                 [1995/06/12~12:30 - forever)                                [1992 - 1998)               3
                                [1993 - 1997)              [1995/06/12~12:30 - 1995/06/13)                                [1993 - 1997)               2
                                [1993 - 1994)                       [1995/06/13 - forever)                                [1993 - 1994)               2
                                [1996 - 1997)                       [1995/06/13 - forever)                                [1996 - 1997)               2
*/

DROP TABLE p;
DROP TABLE q;


/* Type 2: */
/* ------- */

SET CLOCK TO TIMESTAMP '1995/6/12~12:30';

CREATE TABLE p(X integer) AS VALID AND TRANSACTION;
CREATE TABLE q(X integer) AS VALID AND TRANSACTION;

NONSEQUENCED VALID PERIOD '1991-1995' INSERT INTO p VALUES (1);
NONSEQUENCED VALID PERIOD '1993-1997' INSERT INTO p VALUES (1);
NONSEQUENCED VALID PERIOD '1993-1997' INSERT INTO p VALUES (2);
NONSEQUENCED VALID PERIOD '1992-1998' INSERT INTO p VALUES (3);

NONSEQUENCED VALID PERIOD '1993-1995' INSERT INTO q VALUES (1);
NONSEQUENCED VALID PERIOD '1997-2000' INSERT INTO q VALUES (3);

COMMIT;

SET CLOCK TO TIMESTAMP '1995/6/13';

NONSEQUENCED VALID
  DELETE FROM p 
  WHERE NOT EXISTS (SELECT *
                    FROM   q
	            WHERE  p.X = q.X);

VALID AND NONSEQUENCED TRANSACTION 
	SELECT TRANSACTION(p), VALID(p), * FROM p;

/*
                                        VALID                               transaction(p)                                     valid(p)               x
 -------------------------------------------- -------------------------------------------- -------------------------------------------- ---------------
                                [1991 - 1995)                 [1995/06/12~12:30 - forever)                                [1991 - 1995)               1
                                [1993 - 1997)                 [1995/06/12~12:30 - forever)                                [1993 - 1997)               1
                                [1992 - 1998)                 [1995/06/12~12:30 - forever)                                [1992 - 1998)               3
                                [1993 - 1997)              [1995/06/12~12:30 - 1995/06/13)                                [1993 - 1997)               2
*/


DROP TABLE p;
DROP TABLE q;


/* Type 3: */
/* ------- */

SET CLOCK TO TIMESTAMP '1995/6/12~12:30';

CREATE TABLE p(X integer) AS VALID AND TRANSACTION;
CREATE TABLE q(X integer) AS VALID AND TRANSACTION;

NONSEQUENCED VALID PERIOD '1991-1995' INSERT INTO p VALUES (1);
NONSEQUENCED VALID PERIOD '1993-1997' INSERT INTO p VALUES (1);
NONSEQUENCED VALID PERIOD '1993-1997' INSERT INTO p VALUES (2);
NONSEQUENCED VALID PERIOD '1992-1998' INSERT INTO p VALUES (3);

NONSEQUENCED VALID PERIOD '1993-1995' INSERT INTO q VALUES (1);
NONSEQUENCED VALID PERIOD '1997-2000' INSERT INTO q VALUES (3);


COMMIT;

SET CLOCK TO TIMESTAMP '1995/6/13';

VALID
  DELETE FROM p 
  WHERE NOT EXISTS (SELECT *
                    FROM   q
	            WHERE  p.X = q.X);

VALID AND TRANSACTION
	SELECT * FROM p;

/*
                                       SYSTEM                                        VALID               x
 -------------------------------------------- -------------------------------------------- ---------------
              [1995/06/12~12:30 - 1995/06/13)                                [1991 - 1995)               1
              [1995/06/12~12:30 - 1995/06/13)                                [1993 - 1997)               1
              [1995/06/12~12:30 - 1995/06/13)                                [1993 - 1997)               2
              [1995/06/12~12:30 - 1995/06/13)                                [1992 - 1998)               3
                       [1995/06/13 - forever)                                [1993 - 1995)               1
                       [1995/06/13 - forever)                                [1993 - 1995)               1
                       [1995/06/13 - forever)                                [1997 - 1998)               3
*/

DROP TABLE p;
DROP TABLE q;

REMOVE CLOCK;



/* UPDATE : */
/* ======== */


/* 1. No transaction time : */

SET CLOCK TO TIMESTAMP '1995/6/12~12:30';

create table p(i integer);

insert into p values(8888);
insert into p values(9999);

select * from p;

/*
               i
 ---------------
            8888
            9999
*/


alter table p add valid;

valid select * from p;

/*
                                        VALID               i
 -------------------------------------------- ---------------
                 [1995/06/12~12:30 - forever)            8888
                 [1995/06/12~12:30 - forever)            9999
*/


nonsequenced valid period '1997-1999'
update p set i = 1111 where i = 8888;

valid select * from p;

/*
                                        VALID               i
 -------------------------------------------- ---------------
                 [1995/06/12~12:30 - forever)            9999
                    [1995/06/12~12:30 - 1997)            8888
                             [1999 - forever)            8888
                                [1997 - 1999)            1111
*/


create table q(i integer) as valid;

nonsequenced valid period '1997-1999' insert into q values (9999);

valid select * from q;

/*
                                        VALID               i
 -------------------------------------------- ---------------
                                [1997 - 1999)            9999
*/

SET CLOCK TO TIMESTAMP '1995/6/13';

valid 
update p set i = 3333 
where not exists(select * from q where p.i=q.i);

valid select * from p;

/*
                                        VALID               i
 -------------------------------------------- ---------------
                                [1997 - 1999)            9999
                    [1995/06/12~12:30 - 1997)            3333
                             [1999 - forever)            3333
                                [1997 - 1999)            3333
                    [1995/06/12~12:30 - 1997)            3333
                             [1999 - forever)            3333
*/

drop table p;
drop table q;


/* 2. Transaction time : */

SET CLOCK TO TIMESTAMP '1995/6/12~12:30';

create table p(i integer) as transaction;

insert into p values(8888);
insert into p values(9999);

transaction select * from p;

/*
                TRANSACTION    i
 -------------------------- ----
 [1995/06/12~12:30-forever) 8888
 [1995/06/12~12:30-forever) 9999
*/

alter table p add valid;

valid and transaction select * from p;

/*
                TRANSACTION                      VALID    i
 -------------------------- -------------------------- ----
 [1995/06/12~12:30-forever) [1995/06/12~12:30-forever) 8888
 [1995/06/12~12:30-forever) [1995/06/12~12:30-forever) 9999
*/


SET CLOCK TO TIMESTAMP '1995/6/13';

nonsequenced valid period '1997-1999'
update p set i = 1111 where i = 8888;

valid and transaction select * from p;

/*
                   TRANSACTION                      VALID    i
 ----------------------------- -------------------------- ----
    [1995/06/12~12:30-forever) [1995/06/12~12:30-forever) 9999
 [1995/06/12~12:30-1995/06/13) [1995/06/12~12:30-forever) 8888
          [1995/06/13-forever)    [1995/06/12~12:30-1997) 8888
          [1995/06/13-forever)             [1999-forever) 8888
          [1995/06/13-forever)                [1997-1999) 1111
*/

create table q(i integer) as valid;

nonsequenced valid period '1997-1999' insert into q values (9999);

valid select * from q;

/*
       VALID    i
 ----------- ----
 [1997-1999) 9999
*/


valid 
update p set i = 3333 
where not exists(select * from q where p.i=q.i);

valid and transaction select * from p;

/*
                   TRANSACTION                      VALID    i
 ----------------------------- -------------------------- ----
 [1995/06/12~12:30-1995/06/13) [1995/06/12~12:30-forever) 8888
 [1995/06/12~12:30-1995/06/13) [1995/06/12~12:30-forever) 9999
       [1995/06/13-1995/06/13)    [1995/06/12~12:30-1997) 8888
       [1995/06/13-1995/06/13)             [1999-forever) 8888
       [1995/06/13-1995/06/13)                [1997-1999) 1111
          [1995/06/13-forever)                [1997-1999) 9999
          [1995/06/13-forever)    [1995/06/12~12:30-1997) 3333
          [1995/06/13-forever)             [1999-forever) 3333
          [1995/06/13-forever)                [1997-1999) 3333
          [1995/06/13-forever)    [1995/06/12~12:30-1997) 3333
          [1995/06/13-forever)             [1999-forever) 3333
*/

drop table p;
drop table q;

REMOVE CLOCK;
