PRAGMA foreign_keys=ON; CREATE TABLE IF NOT EXISTS meta (key TEXT PRIMARY KEY,value TEXT NOT NULL); CREATE TABLE IF NOT EXISTS sources (name TEXT PRIMARY KEY, revision TEXT NOT NULL, indexed INTEGER NOT NULL DEFAULT 0, documents INTEGER NOT NULL DEFAULT 0); CREATE TABLE IF NOT EXISTS vulnerabilities (id TEXT PRIMARY KEY, published TEXT, modified TEXT, state TEXT, summary TEXT); CREATE TABLE IF NOT EXISTS aliases (alias TEXT NOT NULL, vulnerability_id TEXT NOT NULL REFERENCES vulnerabilities(id) ON DELETE CASCADE, PRIMARY KEY(alias,vulnerability_id)); CREATE INDEX IF NOT EXISTS idx_aliases_vuln ON aliases(vulnerability_id); CREATE TABLE IF NOT EXISTS affected_packages ( id TEXT PRIMARY KEY, vulnerability_id TEXT NOT NULL REFERENCES vulnerabilities(id) ON DELETE CASCADE, ecosystem TEXT, package_name TEXT, ranges_json TEXT NOT NULL, versions_json TEXT NOT NULL, source TEXT NOT NULL); CREATE INDEX IF NOT EXISTS idx_affected_vuln ON affected_packages(vulnerability_id); CREATE INDEX IF NOT EXISTS idx_affected_package ON affected_packages(ecosystem,package_name); CREATE TABLE IF NOT EXISTS cpe_matches ( id TEXT PRIMARY KEY, vulnerability_id TEXT NOT NULL REFERENCES vulnerabilities(id) ON DELETE CASCADE, node_id TEXT REFERENCES cpe_nodes(id), criteria TEXT, vulnerable INTEGER, version_start_including TEXT, version_start_excluding TEXT, version_end_including TEXT, version_end_excluding TEXT, source TEXT NOT NULL ); CREATE INDEX IF NOT EXISTS idx_cpe_vuln ON cpe_matches(vulnerability_id); CREATE TABLE IF NOT EXISTS cpe_nodes ( id TEXT PRIMARY KEY, vulnerability_id TEXT NOT NULL REFERENCES vulnerabilities(id) ON DELETE CASCADE, parent_id TEXT REFERENCES cpe_nodes(id), operator TEXT NOT NULL CHECK (operator IN ('AND', 'OR')), negate INTEGER NOT NULL DEFAULT 0 CHECK (negate IN (0, 1)), source TEXT NOT NULL ); CREATE INDEX IF NOT EXISTS idx_cpe_nodes_vuln ON cpe_nodes(vulnerability_id); CREATE INDEX IF NOT EXISTS idx_cpe_matches_node ON cpe_matches(node_id); -- Conditions expressed as AND, OR and negate are deliberately NOT converted into independent vulnerability assertions. -- Preserve original Red Hat CSAF product IDs, relationships and status rules. CREATE TABLE IF NOT EXISTS redhat_advisories ( id TEXT PRIMARY KEY, title TEXT, initial_release_date TEXT, current_release_date TEXT, product_tree_json TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS redhat_advisory_cves ( id TEXT PRIMARY KEY, advisory_id TEXT NOT NULL REFERENCES redhat_advisories(id) ON DELETE CASCADE, cve_id TEXT NOT NULL REFERENCES vulnerabilities(id) ON DELETE CASCADE, product_status_json TEXT NOT NULL, remediations_json TEXT NOT NULL, UNIQUE(advisory_id,cve_id) ); CREATE INDEX IF NOT EXISTS idx_redhat_advisory_cves_cve ON redhat_advisory_cves(cve_id);