Skip to content

Commit c244741

Browse files
committed
Add .slt tests
1 parent f1907d4 commit c244741

2 files changed

Lines changed: 115 additions & 6 deletions

File tree

datafusion/spark/src/function/math/floor.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,12 @@ use datafusion_expr::{
3131
/// <https://spark.apache.org/docs/latest/api/sql/index.html#floor>
3232
///
3333
/// Differences with DataFusion floor:
34-
/// - Spark's floor returns Int64 for float/integer types
35-
/// - Spark's floor adjusts precision for Decimal128 types
34+
/// - Spark's floor returns Int64 for float and integer inputs; DataFusion preserves
35+
/// the input type (Float32→Float32, Float64→Float64, integers coerced to Float64)
36+
/// - Spark's floor on Decimal128(p, s) returns Decimal128(p−s+1, 0), reducing scale
37+
/// to 0; DataFusion preserves the original precision and scale
38+
/// - Spark only supports Decimal128; DataFusion also supports Decimal32/64/256
39+
/// - Spark does not check for decimal overflow; DataFusion errors on overflow
3640
#[derive(Debug, PartialEq, Eq, Hash)]
3741
pub struct SparkFloor {
3842
signature: Signature,

datafusion/sqllogictest/test_files/spark/math/floor.slt

Lines changed: 109 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,125 @@
2323

2424
## Original Query: SELECT floor(-0.1);
2525
## PySpark 3.5.5 Result: {'FLOOR(-0.1)': Decimal('-1'), 'typeof(FLOOR(-0.1))': 'decimal(1,0)', 'typeof(-0.1)': 'decimal(1,1)'}
26-
#query
27-
#SELECT floor(-0.1::decimal(1,1));
26+
query R
27+
SELECT floor(-0.1::decimal(1,1));
28+
----
29+
-1
2830

2931
## Original Query: SELECT floor(3.1411, -3);
3032
## PySpark 3.5.5 Result: {'floor(3.1411, -3)': Decimal('0'), 'typeof(floor(3.1411, -3))': 'decimal(4,0)', 'typeof(3.1411)': 'decimal(5,4)', 'typeof(-3)': 'int'}
33+
## TODO: 2-argument floor(value, scale) is not yet implemented
3134
#query
3235
#SELECT floor(3.1411::decimal(5,4), -3::int);
3336

3437
## Original Query: SELECT floor(3.1411, 3);
3538
## PySpark 3.5.5 Result: {'floor(3.1411, 3)': Decimal('3.141'), 'typeof(floor(3.1411, 3))': 'decimal(5,3)', 'typeof(3.1411)': 'decimal(5,4)', 'typeof(3)': 'int'}
39+
## TODO: 2-argument floor(value, scale) is not yet implemented
3640
#query
3741
#SELECT floor(3.1411::decimal(5,4), 3::int);
3842

3943
## Original Query: SELECT floor(5);
4044
## PySpark 3.5.5 Result: {'FLOOR(5)': 5, 'typeof(FLOOR(5))': 'bigint', 'typeof(5)': 'int'}
41-
#query
42-
#SELECT floor(5::int);
45+
query I
46+
SELECT floor(5::int);
47+
----
48+
5
49+
50+
# Scalar input: float64 returns bigint
51+
query IIIIIII
52+
SELECT floor(125.9345::DOUBLE), floor(15.9999::DOUBLE), floor(0.9::DOUBLE), floor(-0.1::DOUBLE), floor(-1.999::DOUBLE), floor(123.0::DOUBLE), floor(NULL::DOUBLE);
53+
----
54+
125 15 0 -1 -2 123 NULL
55+
56+
# Scalar input: float32 returns bigint
57+
query IIIIIII
58+
SELECT floor(125.9345::FLOAT), floor(15.9999::FLOAT), floor(0.9::FLOAT), floor(-0.1::FLOAT), floor(-1.999::FLOAT), floor(123.0::FLOAT), floor(NULL::FLOAT);
59+
----
60+
125 15 0 -1 -2 123 NULL
61+
62+
# Scalar input: integer types all return bigint
63+
query III
64+
SELECT floor(5::TINYINT), floor(-3::TINYINT), floor(NULL::TINYINT);
65+
----
66+
5 -3 NULL
67+
68+
query III
69+
SELECT floor(5::SMALLINT), floor(-3::SMALLINT), floor(NULL::SMALLINT);
70+
----
71+
5 -3 NULL
72+
73+
query III
74+
SELECT floor(5::INT), floor(-3::INT), floor(NULL::INT);
75+
----
76+
5 -3 NULL
77+
78+
query III
79+
SELECT floor(5::BIGINT), floor(-3::BIGINT), floor(NULL::BIGINT);
80+
----
81+
5 -3 NULL
82+
83+
# Scalar input: decimal128 with scale > 0 returns decimal with scale 0
84+
# floor(1.50) = 1, floor(-1.50) = -2, floor(1.00) = 1
85+
query RRR
86+
SELECT floor(1.50::DECIMAL(10, 2)), floor(-1.50::DECIMAL(10, 2)), floor(1.00::DECIMAL(10, 2));
87+
----
88+
1 -2 1
89+
90+
# floor(-0.1) = -1 (rounds down away from zero for negatives)
91+
query RR
92+
SELECT floor(-0.1::DECIMAL(3, 1)), floor(NULL::DECIMAL(10, 2));
93+
----
94+
-1 NULL
95+
96+
# floor(3.1411) = 3
97+
query R
98+
SELECT floor(3.1411::DECIMAL(5, 4));
99+
----
100+
3
101+
102+
# Scalar input: decimal128 with scale = 0 passes through unchanged
103+
query RRR
104+
SELECT floor(5::DECIMAL(10, 0)), floor(-3::DECIMAL(10, 0)), floor(NULL::DECIMAL(10, 0));
105+
----
106+
5 -3 NULL
107+
108+
# Array input: float64
109+
query I
110+
SELECT floor(a) FROM (VALUES (125.9345::DOUBLE), (15.9999::DOUBLE), (0.9::DOUBLE), (-0.1::DOUBLE), (-1.999::DOUBLE), (123.0::DOUBLE), (NULL::DOUBLE)) AS t(a);
111+
----
112+
125
113+
15
114+
0
115+
-1
116+
-2
117+
123
118+
NULL
119+
120+
# Array input: float32
121+
query I
122+
SELECT floor(a) FROM (VALUES (125.9345::FLOAT), (15.9999::FLOAT), (0.9::FLOAT), (-0.1::FLOAT), (-1.999::FLOAT), (123.0::FLOAT), (NULL::FLOAT)) AS t(a);
123+
----
124+
125
125+
15
126+
0
127+
-1
128+
-2
129+
123
130+
NULL
131+
132+
# Array input: integers
133+
query I
134+
SELECT floor(a) FROM (VALUES (5::INT), (-3::INT), (NULL::INT)) AS t(a);
135+
----
136+
5
137+
-3
138+
NULL
139+
140+
# Array input: decimal128 with scale > 0
141+
query R
142+
SELECT floor(a) FROM (VALUES (1.50::DECIMAL(10, 2)), (-1.50::DECIMAL(10, 2)), (1.00::DECIMAL(10, 2)), (NULL::DECIMAL(10, 2))) AS t(a);
143+
----
144+
1
145+
-2
146+
1
147+
NULL

0 commit comments

Comments
 (0)