Trouble ticket is here:  https://www.sqlite.org/src/tktview/34cd55d68e

On 5/19/15, Roman Fleysher <roman.fleysher at einstein.yu.edu> wrote:
> -- Dear SQLiters,
>
> -- Here is schema first, table is below,
> -- followed by offending statement.
> -- you can copy and paste the entire body
> -- my comments are SQL compatible
>
> -----------------------------------------
> -- STEP 1 --
> -- create gender and handedness tables to fix possible values
> -- then create subject table
> -----------------------------------------
> CREATE TABLE gender(
>   gender      TEXT PRIMARY KEY NOT NULL,
>   description TEXT
> );
>
> INSERT OR IGNORE INTO gender (gender, description) VALUES ('Male', 'male
> gender');
> INSERT OR IGNORE INTO gender (gender, description) VALUES ('Female', 'female
> gender');
>
> CREATE TABLE handedness(
>   handedness  TEXT PRIMARY KEY NOT NULL,
>   description TEXT
> );
>
> -- force dob yyyy-mm-dd or NULL
> CREATE TABLE subject(
>   subjectID  INT PRIMARY KEY NOT NULL,
>   dob        TEXT CHECK (dob IS date(dob)),
>   gender     TEXT REFERENCES gender(gender) ON UPDATE CASCADE,
>   race       TEXT,
>   handedness TEXT REFERENCES handedness(handedness) ON UPDATE CASCADE
> );
>
>
> -- STEP 2 --
> CREATE TABLE MRIMetric(
>   metricName  TEXT PRIMARY KEY NOT NULL,
>   description TEXT,
>   units       TEXT
> );
>
>
> -- STEP 3 --
> -- examType.examType = name of the table where
> -- to find exam specifics
> CREATE TABLE ExamType(
>   examType    TEXT PRIMARY KEY NOT NULL,
>   description TEXT
> );
>
> INSERT OR IGNORE INTO ExamType (examType, description) VALUES ('MRIExam',
> 'any MRI exam');
> INSERT OR IGNORE INTO ExamType (examType, description) VALUES
> ('demographicExam', 'view on subject table');
> INSERT OR IGNORE INTO ExamType (examType)              VALUES
> ('educationExam');
>
> -- assume date yyyy-mm-dd
> CREATE TABLE Exam(
>   examID      TEXT PRIMARY KEY NOT NULL,
>   subjectID   INTEGER NOT NULL REFERENCES subject(subjectID) ON UPDATE
> CASCADE ON DELETE CASCADE,
>   examType    TEXT NOT NULL REFERENCES examType(examType) ON UPDATE
> CASCADE,
>   comments    TEXT,
>   date        TEXT CHECK (date IS date(date)),
>   age         INTEGER
> );
>
> -----------------------------------------
> -- create triggers to compute age on various updates and inserts
> -----------------------------------------
> -- automatically compute age at the time of exam when exam is inserted
> CREATE TRIGGER ageCalculatorOnExamInsert AFTER INSERT ON Exam FOR EACH ROW
> BEGIN
>   UPDATE OR IGNORE Exam SET age = (
>     SELECT coalesce(
>              strftime('%Y', NEW.date) - strftime('%Y', subject.dob) -1
>           + (strftime('%m-%d', NEW.date) >= strftime('%m-%d',
> subject.dob)),
>             NEW.age)
>     FROM subject
>     WHERE subject.subjectID = NEW.subjectID
>     ) -- this ends select statement that joins exam and subject tables
>   WHERE Exam.examID = NEW.examID;
> END;
>
> -- automatically compute age at the time of exam when exam is updated
> CREATE TRIGGER ageCalculatorOnExamUpdate AFTER UPDATE ON Exam FOR EACH ROW
> BEGIN
>   UPDATE OR IGNORE Exam SET age = (
>     SELECT coalesce(
>              strftime('%Y', NEW.date) - strftime('%Y', subject.dob) -1
>           + (strftime('%m-%d', NEW.date) >= strftime('%m-%d',
> subject.dob)),
>             NEW.age)
>     FROM subject
>     WHERE subject.subjectID = NEW.subjectID
>     ) -- this ends select statement that joins exam and subject tables
>   WHERE Exam.examID = NEW.examID;
> END;
>
> -- automatically compute age at the time of exam when subject.DOB is
> updated
> CREATE TRIGGER ageCalculatorOnSubjectUpdate AFTER UPDATE ON subject FOR EACH
> ROW BEGIN
>   UPDATE OR IGNORE Exam SET age = (
>     SELECT coalesce(
>              strftime('%Y', e.date) - strftime('%Y', NEW.dob) -1
>           + (strftime('%m-%d', e.date) >= strftime('%m-%d', NEW.dob)),
>             e.age)
>     FROM Exam e
>     WHERE Exam.examID = e.examID
>     ) -- this ends select statement that joins exam and subject tables
>   WHERE Exam.subjectID = NEW.subjectID;
> END;
>
> -- STEP 4 --
> CREATE TABLE MRIExam(
>   examID       TEXT NOT NULL REFERENCES Exam(examID) ON UPDATE CASCADE ON
> DELETE CASCADE,
>   ResearchName TEXT,
>   MRN          INTEGER,
>   pipeline     TEXT,
>   DICOMFolder  TEXT,
>   PRIMARY KEY (examID)
> );
>
> CREATE TABLE MRIExamAccession(
>   examID      TEXT NOT NULL REFERENCES MRIExam(examID) ON UPDATE CASCADE ON
> DELETE CASCADE,
>   accession   INTEGER,
>   UNIQUE (examID, accession)
> );
>
> CREATE INDEX MRIExamAccessionIndex ON MRIExamAccession(examID);
>
> -- STEP 5 --
> CREATE TABLE badMRIMetric(
>   examID      TEXT NOT NULL REFERENCES MRIExam(examID) ON UPDATE CASCADE ON
> DELETE CASCADE,
>   metricName  TEXT NOT NULL REFERENCES MRIMetric(metricName) ON UPDATE
> CASCADE,
>   reason      TEXT,
>   PRIMARY KEY (examID, metricName)
> );
>
> -----------------------------------------
> -- STEP 6 --
> -- create wave table
> -----------------------------------------
> CREATE TABLE aboutWave(
>   waveID      TEXT PRIMARY KEY NOT NULL,
>   description TEXT
> );
>
> INSERT OR IGNORE INTO aboutWave (waveID, description) VALUES ('time1',
> 'first scan');
>
> -- force uniqueness of subject+examType+wave.
> -- can not have several instances of one exam type within a wave
> -- given examID can be assigned to several waves
> CREATE TABLE wave(
>   subjectID   INT  NOT NULL REFERENCES subject(subjectID) ON UPDATE CASCADE
> ON DELETE CASCADE,
>   examType    TEXT NOT NULL REFERENCES ExamType(examType) ON UPDATE
> CASCADE,
>   waveID      TEXT NOT NULL REFERENCES aboutWave(waveID)  ON UPDATE
> CASCADE,
>   examID      TEXT NOT NULL REFERENCES Exam(examID)       ON UPDATE CASCADE
> ON DELETE CASCADE,
>   PRIMARY KEY (subjectID, examType, waveID)
> );
>
> CREATE INDEX waveIndex ON wave(examID);
>
>
> -----------------------------------------
> -- STEP 7 --
> -- create view on subject table as demographicExam
> -- use subjectID as examID
> -----------------------------------------
> CREATE VIEW IF NOT EXISTS demographicExam AS
>   SELECT subjectID AS examID,
>          dob,
>          gender,
>          race,
>          handedness
>   FROM subject;
>
> -- automatically add demographic exam to wave and Exam tables when subject
> is inserted
> -- use subjectID as examID
> CREATE TRIGGER demographicInsert AFTER INSERT ON subject FOR EACH ROW BEGIN
>   INSERT INTO Exam (subjectID, examID, examType) VALUES (NEW.subjectID,
> NEW.subjectID, 'demographicExam');
>   INSERT INTO wave (subjectID, examType, waveID, examID) VALUES
> (NEW.subjectID, 'demographicExam', 'time1', NEW.subjectID);
> END;
>
>
> -- STEP 8 --
> CREATE TABLE educationExam(
>   examID      TEXT NOT NULL REFERENCES Exam(examID) ON UPDATE CASCADE ON
> DELETE CASCADE,
>   education   INTEGER,
>   PRIMARY KEY (examID)
> );
>
>
> -----------------------------------------
> ---------- end of schema
> -----------------------------------------
>
> CREATE TABLE demographics(
>   "subjectID" TEXT,
>   "DOB" TEXT,
>   "Age" TEXT,
>   "Education" TEXT,
>   "Gender" TEXT
> );
> INSERT INTO "demographics" VALUES('0001','1992-05-04','23','16','Female');
> INSERT INTO "demographics" VALUES('0002','1992-07-02','22','17','Female');
> INSERT INTO "demographics" VALUES('0003','1986-01-02','29','13','Female');
> INSERT INTO "demographics" VALUES('0004','1989-04-05','26','12','Female');
> INSERT INTO "demographics" VALUES('0005','1989-10-15','25','18','Male');
> INSERT INTO "demographics" VALUES('0006','1989-08-14','25','19','Female');
> INSERT INTO "demographics" VALUES('0007','1990-04-02','25','14','Female');
> INSERT INTO "demographics" VALUES('0008','1982-03-17','33','13','Male');
> INSERT INTO "demographics" VALUES('0009','1966-03-03','49','16','Male');
> INSERT INTO "demographics" VALUES('0010','1988-09-14','26','13','Female');
> INSERT INTO "demographics" VALUES('0011','1987-11-22','27','14','Female');
> INSERT INTO "demographics" VALUES('0012','1969-02-12','46','20','Male');
> INSERT INTO "demographics" VALUES('0013','1988-05-03','27','19','Male');
> INSERT INTO "demographics" VALUES('0014','1966-08-24','48','16','Female');
> INSERT INTO "demographics" VALUES('0015','1970-04-20','45','17','Female');
> INSERT INTO "demographics" VALUES('0016','1991-08-03','23','17','Male');
> INSERT INTO "demographics" VALUES('0017','1989-12-15','25','18','Male');
> INSERT INTO "demographics" VALUES('0018','1991-12-18','23','16','Male');
> INSERT INTO "demographics" VALUES('0019','1989-04-24','26','20','Male');
> INSERT INTO "demographics" VALUES('0020','1965-10-15','49','20','Male');
> INSERT INTO "demographics" VALUES('0021','1980-01-03','35','15','Female');
> INSERT INTO "demographics" VALUES('0022','1979-01-05','36','11','Male');
> INSERT INTO "demographics" VALUES('0023','1990-10-28','24','16','Male');
> INSERT INTO "demographics" VALUES('0024','1983-10-13','31','14','Male');
> INSERT INTO "demographics" VALUES('0025','1991-07-10','23','14','Male');
> INSERT INTO "demographics" VALUES('0026','1991-04-28','24','18','Male');
> INSERT INTO "demographics" VALUES('0027','1988-07-05','26','18.5','Male');
> INSERT INTO "demographics" VALUES('0028','1987-04-22','28','21','Male');
> INSERT INTO "demographics" VALUES('0029','1988-08-04','26','18','Male');
> INSERT INTO "demographics" VALUES('0030','1967-12-13','47','16','Male');
> INSERT INTO "demographics" VALUES('0031','1983-11-05','31','16','Male');
>
> -- Offending statement:
>
> PRAGMA foreign_keys=ON;
> INSERT OR IGNORE INTO subject(subjectID, dob, gender)
>            SELECT subjectID, dob, gender FROM demographics;
> PRAGMA integrity_check;
>
> -- Roman
> _______________________________________________
> sqlite-users mailing list
> sqlite-users at mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>


-- 
D. Richard Hipp
drh at sqlite.org

Reply via email to