From 2335578c94b63b23aec51f4c792b239c8d7404cf Mon Sep 17 00:00:00 2001 From: Pavan-Nambi Date: Sun, 28 Sep 2025 21:16:33 +0530 Subject: [PATCH 1/3] printf truncates floats --- core/functions/printf.rs | 14 +++++++++++--- testing/agg-functions.test | 5 +++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/core/functions/printf.rs b/core/functions/printf.rs index 00c504a6e..b4609d34e 100644 --- a/core/functions/printf.rs +++ b/core/functions/printf.rs @@ -65,9 +65,12 @@ pub fn exec_printf(values: &[Register]) -> crate::Result { return Err(LimboError::InvalidArgument("not enough arguments".into())); } let value = &values[args_index].get_value(); - match value { - Value::Integer(_) => result.push_str(&format!("{value}")), - Value::Float(_) => result.push_str(&format!("{value}")), + match value { + Value::Integer(i) => result.push_str(&format!("{}", i)), + Value::Float(f) => { + let truncated_val = *f as i64; + result.push_str(&format!("{}", truncated_val)); + } _ => result.push('0'), } args_index += 1; @@ -311,6 +314,11 @@ mod tests { vec![text("Number: %d"), text("not a number")], text("Number: 0"), ), + + ( + vec![text("Truncated float: %d"), float(3.9)], + text("Truncated float: 3"), + ), (vec![text("Number: %i"), integer(42)], text("Number: 42")), ]; for (input, output) in test_cases { diff --git a/testing/agg-functions.test b/testing/agg-functions.test index 52fc16f51..26088578a 100755 --- a/testing/agg-functions.test +++ b/testing/agg-functions.test @@ -220,3 +220,8 @@ do_execsql_test_error_content select-nested-agg-func { do_execsql_test_error_content select-nested-agg-func-in-expression { SELECT CASE WHEN max(abs(sum(age))) > 0 THEN 1 ELSE 0 END, sum(age) FROM users; } {"misuse of aggregate function"} + +# https://github.com/tursodatabase/turso/issues/3308 +do_execsql_test printf-19029102 { + select printf('%d', 3.9); +} {3} From a8e337fd42fa3bbbe6d2af48f52352e7c4f1d3aa Mon Sep 17 00:00:00 2001 From: Pavan-Nambi Date: Sun, 28 Sep 2025 21:19:37 +0530 Subject: [PATCH 2/3] fmt,clippy clippy --- core/functions/printf.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/core/functions/printf.rs b/core/functions/printf.rs index b4609d34e..b71d486ec 100644 --- a/core/functions/printf.rs +++ b/core/functions/printf.rs @@ -65,11 +65,11 @@ pub fn exec_printf(values: &[Register]) -> crate::Result { return Err(LimboError::InvalidArgument("not enough arguments".into())); } let value = &values[args_index].get_value(); - match value { - Value::Integer(i) => result.push_str(&format!("{}", i)), + match value { + Value::Integer(i) => result.push_str(&format!("{i}")), Value::Float(f) => { let truncated_val = *f as i64; - result.push_str(&format!("{}", truncated_val)); + result.push_str(&format!("{truncated_val}")); } _ => result.push('0'), } @@ -314,8 +314,7 @@ mod tests { vec![text("Number: %d"), text("not a number")], text("Number: 0"), ), - - ( + ( vec![text("Truncated float: %d"), float(3.9)], text("Truncated float: 3"), ), From 15b5cefa6f75c7fa6bf006479d2ad0e7bf426e78 Mon Sep 17 00:00:00 2001 From: Pavan-Nambi Date: Tue, 30 Sep 2025 22:31:59 +0530 Subject: [PATCH 3/3] format shall not be used --- core/functions/printf.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/functions/printf.rs b/core/functions/printf.rs index b71d486ec..35133c686 100644 --- a/core/functions/printf.rs +++ b/core/functions/printf.rs @@ -66,10 +66,10 @@ pub fn exec_printf(values: &[Register]) -> crate::Result { } let value = &values[args_index].get_value(); match value { - Value::Integer(i) => result.push_str(&format!("{i}")), + Value::Integer(i) => result.push_str(&i.to_string()), Value::Float(f) => { let truncated_val = *f as i64; - result.push_str(&format!("{truncated_val}")); + result.push_str(&truncated_val.to_string()); } _ => result.push('0'), }