-- Migration 014: Extended Vitals (Blood Pressure, VO2 Max, SpO2, Respiratory Rate) -- v9d Phase 2d: Complete vitals tracking -- Date: 2026-03-23 -- Add new vitals fields ALTER TABLE vitals_log ADD COLUMN IF NOT EXISTS blood_pressure_systolic INTEGER CHECK (blood_pressure_systolic > 0 AND blood_pressure_systolic < 300), ADD COLUMN IF NOT EXISTS blood_pressure_diastolic INTEGER CHECK (blood_pressure_diastolic > 0 AND blood_pressure_diastolic < 200), ADD COLUMN IF NOT EXISTS pulse INTEGER CHECK (pulse > 0 AND pulse < 250), ADD COLUMN IF NOT EXISTS vo2_max DECIMAL(4,1) CHECK (vo2_max > 0 AND vo2_max < 100), ADD COLUMN IF NOT EXISTS spo2 INTEGER CHECK (spo2 >= 70 AND spo2 <= 100), ADD COLUMN IF NOT EXISTS respiratory_rate DECIMAL(4,1) CHECK (respiratory_rate > 0 AND respiratory_rate < 60), ADD COLUMN IF NOT EXISTS irregular_heartbeat BOOLEAN DEFAULT false, ADD COLUMN IF NOT EXISTS possible_afib BOOLEAN DEFAULT false; -- Update source check to include omron ALTER TABLE vitals_log DROP CONSTRAINT IF EXISTS vitals_log_source_check; ALTER TABLE vitals_log ADD CONSTRAINT vitals_log_source_check CHECK (source IN ('manual', 'apple_health', 'garmin', 'omron')); -- Comments COMMENT ON COLUMN vitals_log.blood_pressure_systolic IS 'Systolic blood pressure (mmHg) from Omron or manual entry'; COMMENT ON COLUMN vitals_log.blood_pressure_diastolic IS 'Diastolic blood pressure (mmHg) from Omron or manual entry'; COMMENT ON COLUMN vitals_log.pulse IS 'Pulse during blood pressure measurement (bpm)'; COMMENT ON COLUMN vitals_log.vo2_max IS 'VO2 Max from Apple Watch (ml/kg/min)'; COMMENT ON COLUMN vitals_log.spo2 IS 'Blood oxygen saturation (%) from Apple Watch'; COMMENT ON COLUMN vitals_log.respiratory_rate IS 'Respiratory rate (breaths/min) from Apple Watch'; COMMENT ON COLUMN vitals_log.irregular_heartbeat IS 'Irregular heartbeat detected (Omron)'; COMMENT ON COLUMN vitals_log.possible_afib IS 'Possible atrial fibrillation (Omron)';