Skip to content

Commit 10ec14c

Browse files
committed
SQL: Ensure creation is idempotent
This was meant to be done a long time ago, but it was lost in a Git stash. (Sorry!) This is needed to make sure the updater service doesn't continually fail when it is run. Ref: AP-558
1 parent 6399420 commit 10ec14c

File tree

1 file changed

+113
-61
lines changed

1 file changed

+113
-61
lines changed

sql/willa.sql

Lines changed: 113 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -12,25 +12,29 @@ CREATE EXTENSION IF NOT EXISTS pgcrypto;
1212
COMMENT ON EXTENSION pgcrypto IS 'cryptographic functions';
1313

1414

15-
CREATE TYPE "StepType" AS ENUM (
16-
'assistant_message',
17-
'embedding',
18-
'llm',
19-
'retrieval',
20-
'rerank',
21-
'run',
22-
'system_message',
23-
'tool',
24-
'undefined',
25-
'user_message'
26-
);
15+
DO $$ BEGIN
16+
IF to_regtype('"StepType"') IS NULL THEN
17+
CREATE TYPE "StepType" AS ENUM (
18+
'assistant_message',
19+
'embedding',
20+
'llm',
21+
'retrieval',
22+
'rerank',
23+
'run',
24+
'system_message',
25+
'tool',
26+
'undefined',
27+
'user_message'
28+
);
29+
END IF;
30+
END $$;
2731

2832

2933
SET default_tablespace = '';
3034
SET default_table_access_method = heap;
3135

3236

33-
CREATE TABLE "Element" (
37+
CREATE TABLE IF NOT EXISTS "Element" (
3438
id text DEFAULT gen_random_uuid() NOT NULL,
3539
"createdAt" timestamp(3) without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
3640
"updatedAt" timestamp(3) without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
@@ -50,7 +54,7 @@ CREATE TABLE "Element" (
5054
);
5155

5256

53-
CREATE TABLE "Feedback" (
57+
CREATE TABLE IF NOT EXISTS "Feedback" (
5458
id text DEFAULT gen_random_uuid() NOT NULL,
5559
"createdAt" timestamp(3) without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
5660
"updatedAt" timestamp(3) without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
@@ -61,7 +65,7 @@ CREATE TABLE "Feedback" (
6165
);
6266

6367

64-
CREATE TABLE "Step" (
68+
CREATE TABLE IF NOT EXISTS "Step" (
6569
id text DEFAULT gen_random_uuid() NOT NULL,
6670
"createdAt" timestamp(3) without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
6771
"updatedAt" timestamp(3) without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
@@ -79,7 +83,7 @@ CREATE TABLE "Step" (
7983
);
8084

8185

82-
CREATE TABLE "Thread" (
86+
CREATE TABLE IF NOT EXISTS "Thread" (
8387
id text DEFAULT gen_random_uuid() NOT NULL,
8488
"createdAt" timestamp(3) without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
8589
"updatedAt" timestamp(3) without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
@@ -91,7 +95,7 @@ CREATE TABLE "Thread" (
9195
);
9296

9397

94-
CREATE TABLE "User" (
98+
CREATE TABLE IF NOT EXISTS "User" (
9599
id text DEFAULT gen_random_uuid() NOT NULL,
96100
"createdAt" timestamp(3) without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
97101
"updatedAt" timestamp(3) without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
@@ -100,7 +104,7 @@ CREATE TABLE "User" (
100104
);
101105

102106

103-
CREATE TABLE _prisma_migrations (
107+
CREATE TABLE IF NOT EXISTS _prisma_migrations (
104108
id character varying(36) NOT NULL,
105109
checksum character varying(64) NOT NULL,
106110
finished_at timestamp with time zone,
@@ -112,82 +116,130 @@ CREATE TABLE _prisma_migrations (
112116
);
113117

114118

115-
ALTER TABLE ONLY "Element"
116-
ADD CONSTRAINT "Element_pkey" PRIMARY KEY (id);
119+
DO $$ BEGIN
120+
IF NOT EXISTS (SELECT FROM pg_constraint WHERE conname = 'Element_pkey' AND contype = 'p') THEN
121+
ALTER TABLE ONLY "Element"
122+
ADD CONSTRAINT "Element_pkey" PRIMARY KEY (id);
123+
END IF;
124+
END $$;
117125

118-
ALTER TABLE ONLY "Feedback"
119-
ADD CONSTRAINT "Feedback_pkey" PRIMARY KEY (id);
126+
DO $$ BEGIN
127+
IF NOT EXISTS (SELECT FROM pg_constraint WHERE conname = 'Feedback_pkey' AND contype = 'p') THEN
128+
ALTER TABLE ONLY "Feedback"
129+
ADD CONSTRAINT "Feedback_pkey" PRIMARY KEY (id);
130+
END IF;
131+
END $$;
120132

121-
ALTER TABLE ONLY "Step"
122-
ADD CONSTRAINT "Step_pkey" PRIMARY KEY (id);
133+
DO $$ BEGIN
134+
IF NOT EXISTS (SELECT FROM pg_constraint WHERE conname = 'Step_pkey' AND contype = 'p') THEN
135+
ALTER TABLE ONLY "Step"
136+
ADD CONSTRAINT "Step_pkey" PRIMARY KEY (id);
137+
END IF;
138+
END $$;
123139

124-
ALTER TABLE ONLY "Thread"
125-
ADD CONSTRAINT "Thread_pkey" PRIMARY KEY (id);
140+
DO $$ BEGIN
141+
IF NOT EXISTS (SELECT FROM pg_constraint WHERE conname = 'Thread_pkey' AND contype = 'p') THEN
142+
ALTER TABLE ONLY "Thread"
143+
ADD CONSTRAINT "Thread_pkey" PRIMARY KEY (id);
144+
END IF;
145+
END $$;
126146

127-
ALTER TABLE ONLY "User"
128-
ADD CONSTRAINT "User_pkey" PRIMARY KEY (id);
147+
DO $$ BEGIN
148+
IF NOT EXISTS (SELECT FROM pg_constraint WHERE conname = 'User_pkey' AND contype = 'p') THEN
149+
ALTER TABLE ONLY "User"
150+
ADD CONSTRAINT "User_pkey" PRIMARY KEY (id);
151+
END IF;
152+
END $$;
129153

130-
ALTER TABLE ONLY _prisma_migrations
131-
ADD CONSTRAINT _prisma_migrations_pkey PRIMARY KEY (id);
154+
DO $$ BEGIN
155+
IF NOT EXISTS (SELECT FROM pg_constraint WHERE conname = '_prisma_migrations_pkey' AND contype = 'p') THEN
156+
ALTER TABLE ONLY _prisma_migrations
157+
ADD CONSTRAINT _prisma_migrations_pkey PRIMARY KEY (id);
158+
END IF;
159+
END $$;
132160

133161

134-
CREATE INDEX "Element_stepId_idx" ON "Element" USING btree ("stepId");
162+
CREATE INDEX IF NOT EXISTS "Element_stepId_idx" ON "Element" USING btree ("stepId");
135163

136-
CREATE INDEX "Element_threadId_idx" ON "Element" USING btree ("threadId");
164+
CREATE INDEX IF NOT EXISTS "Element_threadId_idx" ON "Element" USING btree ("threadId");
137165

138-
CREATE INDEX "Feedback_createdAt_idx" ON "Feedback" USING btree ("createdAt");
166+
CREATE INDEX IF NOT EXISTS "Feedback_createdAt_idx" ON "Feedback" USING btree ("createdAt");
139167

140-
CREATE INDEX "Feedback_name_idx" ON "Feedback" USING btree (name);
168+
CREATE INDEX IF NOT EXISTS "Feedback_name_idx" ON "Feedback" USING btree (name);
141169

142-
CREATE INDEX "Feedback_name_value_idx" ON "Feedback" USING btree (name, value);
170+
CREATE INDEX IF NOT EXISTS "Feedback_name_value_idx" ON "Feedback" USING btree (name, value);
143171

144-
CREATE INDEX "Feedback_stepId_idx" ON "Feedback" USING btree ("stepId");
172+
CREATE INDEX IF NOT EXISTS "Feedback_stepId_idx" ON "Feedback" USING btree ("stepId");
145173

146-
CREATE INDEX "Feedback_value_idx" ON "Feedback" USING btree (value);
174+
CREATE INDEX IF NOT EXISTS "Feedback_value_idx" ON "Feedback" USING btree (value);
147175

148-
CREATE INDEX "Step_createdAt_idx" ON "Step" USING btree ("createdAt");
176+
CREATE INDEX IF NOT EXISTS "Step_createdAt_idx" ON "Step" USING btree ("createdAt");
149177

150-
CREATE INDEX "Step_endTime_idx" ON "Step" USING btree ("endTime");
178+
CREATE INDEX IF NOT EXISTS "Step_endTime_idx" ON "Step" USING btree ("endTime");
151179

152-
CREATE INDEX "Step_name_idx" ON "Step" USING btree (name);
180+
CREATE INDEX IF NOT EXISTS "Step_name_idx" ON "Step" USING btree (name);
153181

154-
CREATE INDEX "Step_parentId_idx" ON "Step" USING btree ("parentId");
182+
CREATE INDEX IF NOT EXISTS "Step_parentId_idx" ON "Step" USING btree ("parentId");
155183

156-
CREATE INDEX "Step_startTime_idx" ON "Step" USING btree ("startTime");
184+
CREATE INDEX IF NOT EXISTS "Step_startTime_idx" ON "Step" USING btree ("startTime");
157185

158-
CREATE INDEX "Step_threadId_idx" ON "Step" USING btree ("threadId");
186+
CREATE INDEX IF NOT EXISTS "Step_threadId_idx" ON "Step" USING btree ("threadId");
159187

160-
CREATE INDEX "Step_threadId_startTime_endTime_idx" ON "Step" USING btree ("threadId", "startTime", "endTime");
188+
CREATE INDEX IF NOT EXISTS "Step_threadId_startTime_endTime_idx" ON "Step" USING btree ("threadId", "startTime", "endTime");
161189

162-
CREATE INDEX "Step_type_idx" ON "Step" USING btree (type);
190+
CREATE INDEX IF NOT EXISTS "Step_type_idx" ON "Step" USING btree (type);
163191

164-
CREATE INDEX "Thread_createdAt_idx" ON "Thread" USING btree ("createdAt");
192+
CREATE INDEX IF NOT EXISTS "Thread_createdAt_idx" ON "Thread" USING btree ("createdAt");
165193

166-
CREATE INDEX "Thread_name_idx" ON "Thread" USING btree (name);
194+
CREATE INDEX IF NOT EXISTS "Thread_name_idx" ON "Thread" USING btree (name);
167195

168-
CREATE INDEX "User_identifier_idx" ON "User" USING btree (identifier);
196+
CREATE INDEX IF NOT EXISTS "User_identifier_idx" ON "User" USING btree (identifier);
169197

170198

171-
CREATE UNIQUE INDEX "User_identifier_key" ON "User" USING btree (identifier);
199+
CREATE UNIQUE INDEX IF NOT EXISTS "User_identifier_key" ON "User" USING btree (identifier);
172200

173201

174-
ALTER TABLE ONLY "Element"
175-
ADD CONSTRAINT "Element_stepId_fkey" FOREIGN KEY ("stepId") REFERENCES "Step"(id) ON UPDATE CASCADE ON DELETE CASCADE;
202+
DO $$ BEGIN
203+
IF NOT EXISTS (SELECT FROM pg_constraint WHERE conname = 'Element_stepId_fkey' AND contype = 'f') THEN
204+
ALTER TABLE ONLY "Element"
205+
ADD CONSTRAINT "Element_stepId_fkey" FOREIGN KEY ("stepId") REFERENCES "Step"(id) ON UPDATE CASCADE ON DELETE CASCADE;
206+
END IF;
207+
END $$;
176208

177-
ALTER TABLE ONLY "Element"
178-
ADD CONSTRAINT "Element_threadId_fkey" FOREIGN KEY ("threadId") REFERENCES "Thread"(id) ON UPDATE CASCADE ON DELETE CASCADE;
209+
DO $$ BEGIN
210+
IF NOT EXISTS (SELECT FROM pg_constraint WHERE conname = 'Element_threadId_fkey' AND contype = 'f') THEN
211+
ALTER TABLE ONLY "Element"
212+
ADD CONSTRAINT "Element_threadId_fkey" FOREIGN KEY ("threadId") REFERENCES "Thread"(id) ON UPDATE CASCADE ON DELETE CASCADE;
213+
END IF;
214+
END $$;
179215

180-
ALTER TABLE ONLY "Feedback"
181-
ADD CONSTRAINT "Feedback_stepId_fkey" FOREIGN KEY ("stepId") REFERENCES "Step"(id) ON UPDATE CASCADE ON DELETE SET NULL;
216+
DO $$ BEGIN
217+
IF NOT EXISTS (SELECT FROM pg_constraint WHERE conname = 'Feedback_stepId_fkey' AND contype = 'f') THEN
218+
ALTER TABLE ONLY "Feedback"
219+
ADD CONSTRAINT "Feedback_stepId_fkey" FOREIGN KEY ("stepId") REFERENCES "Step"(id) ON UPDATE CASCADE ON DELETE SET NULL;
220+
END IF;
221+
END $$;
182222

183-
ALTER TABLE ONLY "Step"
184-
ADD CONSTRAINT "Step_parentId_fkey" FOREIGN KEY ("parentId") REFERENCES "Step"(id) ON UPDATE CASCADE ON DELETE CASCADE;
223+
DO $$ BEGIN
224+
IF NOT EXISTS (SELECT FROM pg_constraint WHERE conname = 'Step_parentId_fkey' AND contype = 'f') THEN
225+
ALTER TABLE ONLY "Step"
226+
ADD CONSTRAINT "Step_parentId_fkey" FOREIGN KEY ("parentId") REFERENCES "Step"(id) ON UPDATE CASCADE ON DELETE CASCADE;
227+
END IF;
228+
END $$;
185229

186-
ALTER TABLE ONLY "Step"
187-
ADD CONSTRAINT "Step_threadId_fkey" FOREIGN KEY ("threadId") REFERENCES "Thread"(id) ON UPDATE CASCADE ON DELETE CASCADE;
230+
DO $$ BEGIN
231+
IF NOT EXISTS (SELECT FROM pg_constraint WHERE conname = 'Step_threadId_fkey' AND contype = 'f') THEN
232+
ALTER TABLE ONLY "Step"
233+
ADD CONSTRAINT "Step_threadId_fkey" FOREIGN KEY ("threadId") REFERENCES "Thread"(id) ON UPDATE CASCADE ON DELETE CASCADE;
234+
END IF;
235+
END $$;
188236

189-
ALTER TABLE ONLY "Thread"
190-
ADD CONSTRAINT "Thread_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"(id) ON UPDATE CASCADE ON DELETE SET NULL;
237+
DO $$ BEGIN
238+
IF NOT EXISTS (SELECT FROM pg_constraint WHERE conname = 'Thread_userId_fkey' AND contype = 'f') THEN
239+
ALTER TABLE ONLY "Thread"
240+
ADD CONSTRAINT "Thread_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"(id) ON UPDATE CASCADE ON DELETE SET NULL;
241+
END IF;
242+
END $$;
191243

192244

193245
--

0 commit comments

Comments
 (0)