Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
-- Fix (recoupable/chat#1794): the unique constraint on song_identifiers was
-- (platform, identifier_type, value), which is right for track ids (one
-- external id = one recording) but wrong for album ids — an album contains
-- many songs, so (spotify, album_id, <album>) must exist once PER SONG.
-- The old constraint silently capped every album at one mapped song, which is
-- why GET /playcounts served 1 of 18 tracks.
--
-- The old constraint was declared inline in 20260610010000, so its name is
-- Postgres-generated — drop the table's (single) unique constraint by lookup
-- instead of by name.

DO $$
DECLARE
old_constraint text;
BEGIN
SELECT conname INTO old_constraint
FROM pg_constraint
WHERE conrelid = 'public.song_identifiers'::regclass
AND contype = 'u';

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Constraint lookup is too broad and may drop the wrong unique constraint.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At supabase/migrations/20260611120000_fix_song_identifiers_album_uniqueness.sql, line 19:

<comment>Constraint lookup is too broad and may drop the wrong unique constraint.</comment>

<file context>
@@ -5,15 +5,29 @@
+  SELECT conname INTO old_constraint
+  FROM pg_constraint
+  WHERE conrelid = 'public.song_identifiers'::regclass
+    AND contype = 'u';
 
+  IF old_constraint IS NOT NULL THEN
</file context>
Suggested change
AND contype = 'u';
AND contype = 'u'
AND pg_get_constraintdef(oid) = 'UNIQUE (platform, identifier_type, value)';


IF old_constraint IS NOT NULL THEN
EXECUTE format('ALTER TABLE public.song_identifiers DROP CONSTRAINT %I', old_constraint);
END IF;
END $$;

-- New uniqueness: one mapping per (song, platform, identifier_type, value).
ALTER TABLE public.song_identifiers
ADD CONSTRAINT song_identifiers_song_platform_type_value_unique
UNIQUE (song, platform, identifier_type, value);

-- Reverse lookups (value -> songs) keep an index, now non-unique.
CREATE INDEX idx_song_identifiers_lookup
ON public.song_identifiers (platform, identifier_type, value);