From 9cda61694957f2f0428779319f85f626578d0cf0 Mon Sep 17 00:00:00 2001
From: Eelco Dolstra <e.dolstra@tudelft.nl>
Date: Mon, 22 Feb 2010 14:18:55 +0000
Subject: * The database needs a trigger to get rid of self-references to  
 prevent a foreign key constraint violation on the Refs table when   deleting
 a path.

---
 src/libstore/schema.sql | 10 ++++++++++
 1 file changed, 10 insertions(+)

(limited to 'src/libstore/schema.sql')

diff --git a/src/libstore/schema.sql b/src/libstore/schema.sql
index 682ce5ed7b26..4adad34b700e 100644
--- a/src/libstore/schema.sql
+++ b/src/libstore/schema.sql
@@ -17,6 +17,16 @@ create table if not exists Refs (
 create index if not exists IndexReferrer on Refs(referrer);
 create index if not exists IndexReference on Refs(reference);
 
+-- Paths can refer to themselves, causing a tuple (N, N) in the Refs
+-- table.  This causes a deletion of the corresponding row in
+-- ValidPaths to cause a foreign key constraint violation (due to `on
+-- delete restrict' on the `reference' column).  Therefore, explicitly
+-- get rid of self-references.
+create trigger DeleteSelfRefs before delete on ValidPaths
+  begin
+    delete from Refs where referrer = old.id and reference = old.id;
+  end;
+
 create table if not exists DerivationOutputs (
     drv  integer not null,
     id   text not null, -- symbolic output id, usually "out"
-- 
cgit 1.4.1

