use vibesql_types::SqlValue;
use super::{geometry_to_sql_value, sql_value_to_geometry};
use crate::errors::ExecutorError;
pub fn st_srid(args: &[SqlValue]) -> Result<SqlValue, ExecutorError> {
if args.len() != 1 {
return Err(ExecutorError::UnsupportedFeature(format!(
"ST_SRID requires exactly 1 argument, got {}",
args.len()
)));
}
if matches!(args[0], SqlValue::Null) {
return Ok(SqlValue::Null);
}
let geom = sql_value_to_geometry(&args[0])?;
Ok(SqlValue::Integer(geom.srid as i64))
}
pub fn st_set_srid(args: &[SqlValue]) -> Result<SqlValue, ExecutorError> {
if args.len() != 2 {
return Err(ExecutorError::UnsupportedFeature(format!(
"ST_SetSRID requires exactly 2 arguments, got {}",
args.len()
)));
}
if matches!(args[0], SqlValue::Null) {
return Ok(SqlValue::Null);
}
let srid = match &args[1] {
SqlValue::Integer(i) => *i as i32,
SqlValue::Bigint(i) => *i as i32,
SqlValue::Smallint(i) => *i as i32,
SqlValue::Null => {
return Err(ExecutorError::UnsupportedFeature("SRID cannot be NULL".to_string()))
}
_ => return Err(ExecutorError::UnsupportedFeature("SRID must be an integer".to_string())),
};
if srid < 0 {
return Err(ExecutorError::UnsupportedFeature(format!("SRID must be >= 0, got {}", srid)));
}
let mut geom = sql_value_to_geometry(&args[0])?;
geom.set_srid(srid);
Ok(geometry_to_sql_value(geom.geometry, geom.srid))
}
#[allow(dead_code)]
pub fn st_transform(args: &[SqlValue]) -> Result<SqlValue, ExecutorError> {
if args.len() != 2 {
return Err(ExecutorError::UnsupportedFeature(format!(
"ST_Transform requires exactly 2 arguments, got {}",
args.len()
)));
}
Err(ExecutorError::UnsupportedFeature(
"ST_Transform is not yet implemented (Phase 4 feature)".to_string(),
))
}
const EPSG_WGS84: i32 = 4326; const EPSG_WEB_MERCATOR: i32 = 3857; const EPSG_US_NATIONAL_ATLAS: i32 = 2163;
#[allow(dead_code)]
fn is_valid_srid(srid: i32) -> bool {
match srid {
0 => true, EPSG_WGS84 => true,
EPSG_WEB_MERCATOR => true,
EPSG_US_NATIONAL_ATLAS => true,
_ => false, }
}