diff --git a/compute_tools/src/extension_server.rs b/compute_tools/src/extension_server.rs index 54c22026e7..bf32f4a517 100644 --- a/compute_tools/src/extension_server.rs +++ b/compute_tools/src/extension_server.rs @@ -74,6 +74,7 @@ More specifically, here is an example ext_index.json use anyhow::Context; use anyhow::{self, Result}; use compute_api::spec::RemoteExtSpec; +use regex::Regex; use remote_storage::*; use serde_json; use std::io::Read; @@ -108,14 +109,58 @@ pub fn get_pg_version(pgbin: &str) -> String { // pg_config --version returns a (platform specific) human readable string // such as "PostgreSQL 15.4". We parse this to v14/v15 let human_version = get_pg_config("--version", pgbin); - if human_version.contains("15") { - return "v15".to_string(); - } else if human_version.contains("14") { - return "v14".to_string(); + return parse_pg_version(&human_version).to_string(); +} + +fn parse_pg_version(human_version: &str) -> &str { + match Regex::new(r"(?\d+)\.(?\d+)") + .unwrap() + .captures(human_version) + { + Some(captures) if captures.len() == 3 => match &captures["major"] { + "14" => return "v14", + "15" => return "v15", + _ => {} + }, + _ => {} } panic!("Unsuported postgres version {human_version}"); } +#[cfg(test)] +mod tests { + use super::parse_pg_version; + + #[test] + fn test_parse_pg_version() { + assert_eq!(parse_pg_version("PostgreSQL 15.4"), "v15"); + assert_eq!(parse_pg_version("PostgreSQL 15.14"), "v15"); + assert_eq!( + parse_pg_version("PostgreSQL 15.4 (Ubuntu 15.4-0ubuntu0.23.04.1)"), + "v15" + ); + + assert_eq!(parse_pg_version("PostgreSQL 14.15"), "v14"); + assert_eq!(parse_pg_version("PostgreSQL 14.0"), "v14"); + assert_eq!( + parse_pg_version("PostgreSQL 14.9 (Debian 14.9-1.pgdg120+1"), + "v14" + ); + } + + #[test] + #[should_panic] + fn test_parse_pg_unsupported_version() { + parse_pg_version("PostgreSQL 13.14"); + } + + #[test] + #[should_panic] + fn test_parse_pg_incorrect_version_format() { + parse_pg_version("PostgreSQL 14"); + } +} + // download the archive for a given extension, // unzip it, and place files in the appropriate locations (share/lib) pub async fn download_extension(