diff --git a/CHANGELOG.md b/CHANGELOG.md index 56301316..b306c621 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,8 @@ # CHANGELOG.md -## unreleased +## 0.16.1 + - fix a bug where setting a variable to a non-string value would always set it to null - clearer debug logs (https://github.com/wooorm/markdown-rs/pull/92) - update compiler to rust 1.74 - use user id and group id 1000 in docker image (this is the default user id in most linux distributions) diff --git a/Cargo.lock b/Cargo.lock index 5760d1bd..24e54069 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2269,7 +2269,7 @@ dependencies = [ [[package]] name = "sqlpage" -version = "0.16.0" +version = "0.16.1" dependencies = [ "actix-rt", "actix-web", diff --git a/Cargo.toml b/Cargo.toml index b1433b2a..10819825 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sqlpage" -version = "0.16.0" +version = "0.16.1" edition = "2021" description = "A SQL-only web application framework. Takes .sql files and formats the query result using pre-made configurable professional-looking components." keywords = ["web", "sql", "framework"] diff --git a/src/webserver/database/execute_queries.rs b/src/webserver/database/execute_queries.rs index 6dffa36b..366c11a7 100644 --- a/src/webserver/database/execute_queries.rs +++ b/src/webserver/database/execute_queries.rs @@ -6,11 +6,12 @@ use std::collections::HashMap; use super::sql::{ParsedSqlFile, ParsedStatement, StmtWithParams}; use crate::webserver::database::sql_pseudofunctions::extract_req_param; +use crate::webserver::database::sql_to_json::row_to_string; use crate::webserver::http::{RequestInfo, SingleOrVec}; use sqlx::any::{AnyArguments, AnyQueryResult, AnyRow, AnyStatement, AnyTypeInfo}; use sqlx::pool::PoolConnection; -use sqlx::{Any, AnyConnection, Arguments, Either, Executor, Row, Statement}; +use sqlx::{Any, AnyConnection, Arguments, Either, Executor, Statement}; use super::sql_pseudofunctions::StmtParam; use super::{highlight_sql_error, Database, DbItem}; @@ -54,8 +55,7 @@ pub fn stream_query_results<'a>( let query = bind_parameters(value, request).await?; let connection = take_connection(db, &mut connection_opt).await?; log::debug!("Executing query to set the {variable:?} variable: {:?}", query.sql); - let value: Option = connection.fetch_optional(query).await? - .and_then(|row| row.try_get::, _>(0).ok().flatten()); + let value: Option = connection.fetch_optional(query).await?.as_ref().and_then(row_to_string); let (vars, name) = vars_and_name(request, variable)?; if let Some(value) = value { log::debug!("Setting variable {name} to {value:?}"); diff --git a/src/webserver/database/sql_to_json.rs b/src/webserver/database/sql_to_json.rs index 15ad8e89..070d979b 100644 --- a/src/webserver/database/sql_to_json.rs +++ b/src/webserver/database/sql_to_json.rs @@ -99,6 +99,16 @@ pub fn sql_nonnull_to_json<'r>(mut get_ref: impl FnMut() -> sqlx::any::AnyValueR } } +/// Takes the first column of a row and converts it to a string. +pub fn row_to_string(row: &AnyRow) -> Option { + let col = row.columns().get(0)?; + match sql_to_json(row, col) { + serde_json::Value::String(s) => Some(s), + serde_json::Value::Null => None, + other => Some(other.to_string()), + } +} + #[actix_web::test] async fn test_row_to_json() -> anyhow::Result<()> { use sqlx::Connection; diff --git a/tests/sql_test_files/it_works_set_variable_numeric.sql b/tests/sql_test_files/it_works_set_variable_numeric.sql new file mode 100644 index 00000000..ae392824 --- /dev/null +++ b/tests/sql_test_files/it_works_set_variable_numeric.sql @@ -0,0 +1,9 @@ +set two = 2; +select 'text' as component, + CASE + WHEN $two = '2' -- All variables are strings + THEN + 'It works !' + ELSE + 'error: expected "2", got: ' || COALESCE($two, 'null') + END as contents;