diff --git a/src/query/functions/src/scalars/arithmetic/src/arithmetic.rs b/src/query/functions/src/scalars/arithmetic/src/arithmetic.rs index b0152c0764ff9..a7ca51bee9f3d 100644 --- a/src/query/functions/src/scalars/arithmetic/src/arithmetic.rs +++ b/src/query/functions/src/scalars/arithmetic/src/arithmetic.rs @@ -289,6 +289,7 @@ fn parse_number( where T: FromStr + num_traits::Num, { + let s = s.trim(); match s.parse::() { Ok(v) => Ok(v), Err(e) => { diff --git a/src/query/functions/src/scalars/boolean.rs b/src/query/functions/src/scalars/boolean.rs index 88dd6b0e222d7..660d182a420e1 100644 --- a/src/query/functions/src/scalars/boolean.rs +++ b/src/query/functions/src/scalars/boolean.rs @@ -477,9 +477,10 @@ fn eval_boolean_to_string(val: Value, ctx: &mut EvalContext) -> Val fn eval_string_to_boolean(val: Value, ctx: &mut EvalContext) -> Value { vectorize_with_builder_1_arg::(|val, output, ctx| { - if val.eq_ignore_ascii_case("true") { + let val = val.trim(); + if val.eq_ignore_ascii_case("true") || val == "1" { output.push(true); - } else if val.eq_ignore_ascii_case("false") { + } else if val.eq_ignore_ascii_case("false") || val == "0" { output.push(false); } else { ctx.set_error(output.len(), "cannot parse to type `BOOLEAN`"); diff --git a/src/query/functions/tests/it/scalars/testdata/cast.txt b/src/query/functions/tests/it/scalars/testdata/cast.txt index 50ecc731475fd..0416642ab4656 100644 --- a/src/query/functions/tests/it/scalars/testdata/cast.txt +++ b/src/query/functions/tests/it/scalars/testdata/cast.txt @@ -898,20 +898,22 @@ error: -error: - --> SQL:1:1 - | -1 | CAST('0' AS BOOLEAN) - | ^^^^^^^^^^^^^^^^^^^^ cannot parse to type `BOOLEAN` while evaluating function `to_boolean('0')` in expr `CAST('0' AS Boolean)` - - +ast : CAST('0' AS BOOLEAN) +raw expr : CAST('0' AS Boolean) +checked expr : CAST("0" AS Boolean) +optimized expr : false +output type : Boolean +output domain : {FALSE} +output : false -error: - --> SQL:1:1 - | -1 | CAST('1' AS BOOLEAN) - | ^^^^^^^^^^^^^^^^^^^^ cannot parse to type `BOOLEAN` while evaluating function `to_boolean('1')` in expr `CAST('1' AS Boolean)` +ast : CAST('1' AS BOOLEAN) +raw expr : CAST('1' AS Boolean) +checked expr : CAST("1" AS Boolean) +optimized expr : true +output type : Boolean +output domain : {TRUE} +output : true ast : CAST('true' AS BOOLEAN) @@ -3357,19 +3359,19 @@ output : NULL ast : TRY_CAST('0' AS BOOLEAN) raw expr : TRY_CAST('0' AS Boolean) checked expr : TRY_CAST("0" AS Boolean NULL) -optimized expr : NULL +optimized expr : false output type : Boolean NULL -output domain : {NULL} -output : NULL +output domain : {FALSE} +output : false ast : TRY_CAST('1' AS BOOLEAN) raw expr : TRY_CAST('1' AS Boolean) checked expr : TRY_CAST("1" AS Boolean NULL) -optimized expr : NULL +optimized expr : true output type : Boolean NULL -output domain : {NULL} -output : NULL +output domain : {TRUE} +output : true ast : TRY_CAST('true' AS BOOLEAN) diff --git a/tests/sqllogictests/suites/duckdb/sql/cast/test_exponent_in_cast.test b/tests/sqllogictests/suites/duckdb/sql/cast/test_exponent_in_cast.test index bb0e554243703..c2c4cdb081ec8 100644 --- a/tests/sqllogictests/suites/duckdb/sql/cast/test_exponent_in_cast.test +++ b/tests/sqllogictests/suites/duckdb/sql/cast/test_exponent_in_cast.test @@ -16,8 +16,10 @@ SELECT CAST(' e1' AS DOUBLE) statement error 1006 SELECT CAST(' E1' AS DOUBLE) -statement error 1006 +query I SELECT CAST(' 1e1' AS INTEGER) +---- +10 query R SELECT CAST('1e1' AS DOUBLE) diff --git a/tests/sqllogictests/suites/query/functions/02_0002_function_cast.test b/tests/sqllogictests/suites/query/functions/02_0002_function_cast.test index 3d9a155e9b900..028ce46d468f6 100644 --- a/tests/sqllogictests/suites/query/functions/02_0002_function_cast.test +++ b/tests/sqllogictests/suites/query/functions/02_0002_function_cast.test @@ -117,6 +117,16 @@ SELECT '33'::unsigned = 33 ---- 1 +query RI +SELECT CAST(' 1e1' AS DOUBLE), CAST(' 1e1' AS INTEGER) +---- +10.0 10 + +query II +SELECT CAST(' -42 ' AS INTEGER), CAST(' 42 ' AS UNSIGNED) +---- +-42 42 + statement error 1006 @@ -144,6 +154,16 @@ select 'false'::boolean = not 'true'::boolean ---- 1 +query BBBB +select '1'::boolean, '0'::boolean, ' true '::boolean, ' false '::boolean +---- +1 0 1 0 + +query BBBB +select true='1', false='0', ' 1 '=true, ' 0 '=false +---- +1 1 1 1 + query B SELECT to_timestamp('2021-03-05 01:01:01') + 1 = to_timestamp('2021-03-05 01:01:01.000001') ----