From a471a45447c42117dd95b662ed6f7f0a971282ef Mon Sep 17 00:00:00 2001 From: "A. Wilcox" Date: Fri, 30 Jan 2026 13:53:00 -0600 Subject: [PATCH] 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 --- sql/willa.sql | 179 ++++++++++++++++++++++---------------------------- 1 file changed, 78 insertions(+), 101 deletions(-) diff --git a/sql/willa.sql b/sql/willa.sql index c248ffb..076f310 100644 --- a/sql/willa.sql +++ b/sql/willa.sql @@ -12,56 +12,55 @@ CREATE EXTENSION IF NOT EXISTS pgcrypto; COMMENT ON EXTENSION pgcrypto IS 'cryptographic functions'; -CREATE TYPE "StepType" AS ENUM ( - 'assistant_message', - 'embedding', - 'llm', - 'retrieval', - 'rerank', - 'run', - 'system_message', - 'tool', - 'undefined', - 'user_message' -); +DO $$ BEGIN + IF to_regtype('"StepType"') IS NULL THEN + CREATE TYPE "StepType" AS ENUM ( + 'assistant_message', + 'embedding', + 'llm', + 'retrieval', + 'rerank', + 'run', + 'system_message', + 'tool', + 'undefined', + 'user_message' + ); + END IF; +END $$; SET default_tablespace = ''; SET default_table_access_method = heap; -CREATE TABLE "Element" ( + +CREATE TABLE IF NOT EXISTS "User" ( id text DEFAULT gen_random_uuid() NOT NULL, "createdAt" timestamp(3) without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL, "updatedAt" timestamp(3) without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL, - "threadId" text, - "stepId" text NOT NULL, metadata jsonb NOT NULL, - mime text, - name text NOT NULL, - "objectKey" text, - url text, - "chainlitKey" text, - display text, - size text, - language text, - page integer, - props jsonb + identifier text NOT NULL, + PRIMARY KEY (id), + UNIQUE (identifier) ); -CREATE TABLE "Feedback" ( +CREATE TABLE IF NOT EXISTS "Thread" ( id text DEFAULT gen_random_uuid() NOT NULL, "createdAt" timestamp(3) without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL, "updatedAt" timestamp(3) without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL, - "stepId" text, - name text NOT NULL, - value double precision NOT NULL, - comment text + "deletedAt" timestamp(3) without time zone, + name text, + metadata jsonb NOT NULL, + "userId" text, + tags text[] DEFAULT ARRAY[]::text[], + PRIMARY KEY (id), + FOREIGN KEY ("userId") REFERENCES "User"(id) ON UPDATE CASCADE ON DELETE SET NULL ); -CREATE TABLE "Step" ( +CREATE TABLE IF NOT EXISTS "Step" ( id text DEFAULT gen_random_uuid() NOT NULL, "createdAt" timestamp(3) without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL, "updatedAt" timestamp(3) without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL, @@ -75,32 +74,50 @@ CREATE TABLE "Step" ( "showInput" text DEFAULT 'json'::text, "isError" boolean DEFAULT false, "startTime" timestamp(3) without time zone NOT NULL, - "endTime" timestamp(3) without time zone NOT NULL + "endTime" timestamp(3) without time zone NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY ("parentId") REFERENCES "Step"(id) ON UPDATE CASCADE ON DELETE CASCADE, + FOREIGN KEY ("threadId") REFERENCES "Thread"(id) ON UPDATE CASCADE ON DELETE CASCADE ); -CREATE TABLE "Thread" ( +CREATE TABLE IF NOT EXISTS "Element" ( id text DEFAULT gen_random_uuid() NOT NULL, "createdAt" timestamp(3) without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL, "updatedAt" timestamp(3) without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL, - "deletedAt" timestamp(3) without time zone, - name text, + "threadId" text, + "stepId" text NOT NULL, metadata jsonb NOT NULL, - "userId" text, - tags text[] DEFAULT ARRAY[]::text[] + mime text, + name text NOT NULL, + "objectKey" text, + url text, + "chainlitKey" text, + display text, + size text, + language text, + page integer, + props jsonb, + PRIMARY KEY (id), + FOREIGN KEY ("stepId") REFERENCES "Step"(id) ON UPDATE CASCADE ON DELETE CASCADE, + FOREIGN KEY ("threadId") REFERENCES "Thread"(id) ON UPDATE CASCADE ON DELETE CASCADE ); -CREATE TABLE "User" ( +CREATE TABLE IF NOT EXISTS "Feedback" ( id text DEFAULT gen_random_uuid() NOT NULL, "createdAt" timestamp(3) without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL, "updatedAt" timestamp(3) without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL, - metadata jsonb NOT NULL, - identifier text NOT NULL + "stepId" text, + name text NOT NULL, + value double precision NOT NULL, + comment text, + PRIMARY KEY (id), + FOREIGN KEY ("stepId") REFERENCES "Step"(id) ON UPDATE CASCADE ON DELETE SET NULL ); -CREATE TABLE _prisma_migrations ( +CREATE TABLE IF NOT EXISTS _prisma_migrations ( id character varying(36) NOT NULL, checksum character varying(64) NOT NULL, finished_at timestamp with time zone, @@ -108,86 +125,46 @@ CREATE TABLE _prisma_migrations ( logs text, rolled_back_at timestamp with time zone, started_at timestamp with time zone DEFAULT now() NOT NULL, - applied_steps_count integer DEFAULT 0 NOT NULL + applied_steps_count integer DEFAULT 0 NOT NULL, + PRIMARY KEY (id) ); -ALTER TABLE ONLY "Element" - ADD CONSTRAINT "Element_pkey" PRIMARY KEY (id); - -ALTER TABLE ONLY "Feedback" - ADD CONSTRAINT "Feedback_pkey" PRIMARY KEY (id); - -ALTER TABLE ONLY "Step" - ADD CONSTRAINT "Step_pkey" PRIMARY KEY (id); - -ALTER TABLE ONLY "Thread" - ADD CONSTRAINT "Thread_pkey" PRIMARY KEY (id); - -ALTER TABLE ONLY "User" - ADD CONSTRAINT "User_pkey" PRIMARY KEY (id); - -ALTER TABLE ONLY _prisma_migrations - ADD CONSTRAINT _prisma_migrations_pkey PRIMARY KEY (id); - - -CREATE INDEX "Element_stepId_idx" ON "Element" USING btree ("stepId"); - -CREATE INDEX "Element_threadId_idx" ON "Element" USING btree ("threadId"); - -CREATE INDEX "Feedback_createdAt_idx" ON "Feedback" USING btree ("createdAt"); - -CREATE INDEX "Feedback_name_idx" ON "Feedback" USING btree (name); - -CREATE INDEX "Feedback_name_value_idx" ON "Feedback" USING btree (name, value); - -CREATE INDEX "Feedback_stepId_idx" ON "Feedback" USING btree ("stepId"); - -CREATE INDEX "Feedback_value_idx" ON "Feedback" USING btree (value); - -CREATE INDEX "Step_createdAt_idx" ON "Step" USING btree ("createdAt"); - -CREATE INDEX "Step_endTime_idx" ON "Step" USING btree ("endTime"); - -CREATE INDEX "Step_name_idx" ON "Step" USING btree (name); +CREATE INDEX IF NOT EXISTS "Element_stepId_idx" ON "Element" USING btree ("stepId"); -CREATE INDEX "Step_parentId_idx" ON "Step" USING btree ("parentId"); +CREATE INDEX IF NOT EXISTS "Element_threadId_idx" ON "Element" USING btree ("threadId"); -CREATE INDEX "Step_startTime_idx" ON "Step" USING btree ("startTime"); +CREATE INDEX IF NOT EXISTS "Feedback_createdAt_idx" ON "Feedback" USING btree ("createdAt"); -CREATE INDEX "Step_threadId_idx" ON "Step" USING btree ("threadId"); +CREATE INDEX IF NOT EXISTS "Feedback_name_idx" ON "Feedback" USING btree (name); -CREATE INDEX "Step_threadId_startTime_endTime_idx" ON "Step" USING btree ("threadId", "startTime", "endTime"); +CREATE INDEX IF NOT EXISTS "Feedback_name_value_idx" ON "Feedback" USING btree (name, value); -CREATE INDEX "Step_type_idx" ON "Step" USING btree (type); +CREATE INDEX IF NOT EXISTS "Feedback_stepId_idx" ON "Feedback" USING btree ("stepId"); -CREATE INDEX "Thread_createdAt_idx" ON "Thread" USING btree ("createdAt"); +CREATE INDEX IF NOT EXISTS "Feedback_value_idx" ON "Feedback" USING btree (value); -CREATE INDEX "Thread_name_idx" ON "Thread" USING btree (name); +CREATE INDEX IF NOT EXISTS "Step_createdAt_idx" ON "Step" USING btree ("createdAt"); -CREATE INDEX "User_identifier_idx" ON "User" USING btree (identifier); +CREATE INDEX IF NOT EXISTS "Step_endTime_idx" ON "Step" USING btree ("endTime"); +CREATE INDEX IF NOT EXISTS "Step_name_idx" ON "Step" USING btree (name); -CREATE UNIQUE INDEX "User_identifier_key" ON "User" USING btree (identifier); +CREATE INDEX IF NOT EXISTS "Step_parentId_idx" ON "Step" USING btree ("parentId"); +CREATE INDEX IF NOT EXISTS "Step_startTime_idx" ON "Step" USING btree ("startTime"); -ALTER TABLE ONLY "Element" - ADD CONSTRAINT "Element_stepId_fkey" FOREIGN KEY ("stepId") REFERENCES "Step"(id) ON UPDATE CASCADE ON DELETE CASCADE; +CREATE INDEX IF NOT EXISTS "Step_threadId_idx" ON "Step" USING btree ("threadId"); -ALTER TABLE ONLY "Element" - ADD CONSTRAINT "Element_threadId_fkey" FOREIGN KEY ("threadId") REFERENCES "Thread"(id) ON UPDATE CASCADE ON DELETE CASCADE; +CREATE INDEX IF NOT EXISTS "Step_threadId_startTime_endTime_idx" ON "Step" USING btree ("threadId", "startTime", "endTime"); -ALTER TABLE ONLY "Feedback" - ADD CONSTRAINT "Feedback_stepId_fkey" FOREIGN KEY ("stepId") REFERENCES "Step"(id) ON UPDATE CASCADE ON DELETE SET NULL; +CREATE INDEX IF NOT EXISTS "Step_type_idx" ON "Step" USING btree (type); -ALTER TABLE ONLY "Step" - ADD CONSTRAINT "Step_parentId_fkey" FOREIGN KEY ("parentId") REFERENCES "Step"(id) ON UPDATE CASCADE ON DELETE CASCADE; +CREATE INDEX IF NOT EXISTS "Thread_createdAt_idx" ON "Thread" USING btree ("createdAt"); -ALTER TABLE ONLY "Step" - ADD CONSTRAINT "Step_threadId_fkey" FOREIGN KEY ("threadId") REFERENCES "Thread"(id) ON UPDATE CASCADE ON DELETE CASCADE; +CREATE INDEX IF NOT EXISTS "Thread_name_idx" ON "Thread" USING btree (name); -ALTER TABLE ONLY "Thread" - ADD CONSTRAINT "Thread_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"(id) ON UPDATE CASCADE ON DELETE SET NULL; +CREATE INDEX IF NOT EXISTS "User_identifier_idx" ON "User" USING btree (identifier); --