-- Fix ambiguous column reference errors in stats functions. -- -- If earlier migrations have already been applied, editing them will not update -- the deployed database. This migration re-defines the functions using -- CREATE OR REPLACE so the corrected definitions take effect. CREATE OR REPLACE FUNCTION update_and_get_stats() RETURNS TABLE ( pokemon_caught BIGINT, total_users BIGINT, completed_pokedexes BIGINT, updated_at TIMESTAMPTZ ) SECURITY DEFINER LANGUAGE plpgsql AS $$ DECLARE v_pokemon_caught BIGINT; v_total_users BIGINT; v_completed_pokedexes BIGINT; BEGIN -- Calculate current stats: count of caught Pokémon SELECT COUNT(*) INTO v_pokemon_caught FROM catch_records WHERE caught = true; -- Calculate current stats: count of total users SELECT COUNT(*) INTO v_total_users FROM auth.users; -- Calculate current stats: count of completed pokedexes -- A pokedex is completed when all its entries have caught = true SELECT COUNT(*) INTO v_completed_pokedexes FROM ( SELECT "pokedexId" FROM catch_records GROUP BY "pokedexId" HAVING COUNT(*) = COUNT(*) FILTER (WHERE caught = true) ) completed; -- Update cache using UPSERT pattern INSERT INTO stats_cache (pokemon_caught, total_users, completed_pokedexes, updated_at) VALUES (v_pokemon_caught, v_total_users, v_completed_pokedexes, NOW()) ON CONFLICT (id) DO UPDATE SET pokemon_caught = EXCLUDED.pokemon_caught, total_users = EXCLUDED.total_users, completed_pokedexes = EXCLUDED.completed_pokedexes, updated_at = NOW(); -- Return stats RETURN QUERY SELECT v_pokemon_caught, v_total_users, v_completed_pokedexes, NOW() AS updated_at; END; $$; CREATE OR REPLACE FUNCTION get_public_stats() RETURNS TABLE ( pokemon_caught BIGINT, total_users BIGINT, completed_pokedexes BIGINT, updated_at TIMESTAMPTZ ) SECURITY DEFINER LANGUAGE plpgsql AS $$ DECLARE v_cache_exists BOOLEAN; BEGIN -- Check if cache exists and is fresh (within 24 hours) SELECT EXISTS( SELECT 1 FROM stats_cache WHERE stats_cache.updated_at > NOW() - INTERVAL '24 hours' ) INTO v_cache_exists; IF v_cache_exists THEN -- Return cached stats (qualify updated_at to avoid ambiguity with output parameter) RETURN QUERY SELECT sc.pokemon_caught, sc.total_users, sc.completed_pokedexes, sc.updated_at FROM stats_cache sc ORDER BY sc.updated_at DESC LIMIT 1; ELSE -- Cache is stale or doesn't exist, update it RETURN QUERY SELECT * FROM update_and_get_stats(); END IF; END; $$;