Skip to content

Commit d201ffb

Browse files
authored
fix(expression): fix incorrect nullable array cast (#10946)
* fix(query): array cast * fix(query): array cast * fix(query): map cast
1 parent b1f439b commit d201ffb

File tree

9 files changed

+47
-7
lines changed

9 files changed

+47
-7
lines changed

src/query/expression/src/evaluator.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use std::ops::Not;
1717

1818
use common_arrow::arrow::bitmap;
1919
use common_arrow::arrow::bitmap::Bitmap;
20+
use common_arrow::arrow::bitmap::MutableBitmap;
2021
use common_exception::ErrorCode;
2122
use common_exception::Result;
2223
use common_exception::Span;
@@ -369,6 +370,12 @@ impl<'a> Evaluator<'a> {
369370
},
370371
(DataType::Array(inner_src_ty), DataType::Array(inner_dest_ty)) => match value {
371372
Value::Scalar(Scalar::Array(array)) => {
373+
let validity = validity.map(|validity| {
374+
let mut inner_validity = MutableBitmap::with_capacity(array.len());
375+
inner_validity.extend_constant(array.len(), validity.get_bit(0));
376+
inner_validity.into()
377+
});
378+
372379
let new_array = self
373380
.run_cast(
374381
span,
@@ -382,6 +389,17 @@ impl<'a> Evaluator<'a> {
382389
Ok(Value::Scalar(Scalar::Array(new_array)))
383390
}
384391
Value::Column(Column::Array(col)) => {
392+
let validity = validity.map(|validity| {
393+
let mut inner_validity = MutableBitmap::with_capacity(col.len());
394+
for (index, offsets) in col.offsets.windows(2).enumerate() {
395+
inner_validity.extend_constant(
396+
(offsets[1] - offsets[0]) as usize,
397+
validity.get_bit(index),
398+
);
399+
}
400+
inner_validity.into()
401+
});
402+
385403
let new_col = self
386404
.run_cast(
387405
span,
@@ -415,6 +433,12 @@ impl<'a> Evaluator<'a> {
415433
},
416434
(DataType::Map(inner_src_ty), DataType::Map(inner_dest_ty)) => match value {
417435
Value::Scalar(Scalar::Map(array)) => {
436+
let validity = validity.map(|validity| {
437+
let mut inner_validity = MutableBitmap::with_capacity(array.len());
438+
inner_validity.extend_constant(array.len(), validity.get_bit(0));
439+
inner_validity.into()
440+
});
441+
418442
let new_array = self
419443
.run_cast(
420444
span,
@@ -428,6 +452,12 @@ impl<'a> Evaluator<'a> {
428452
Ok(Value::Scalar(Scalar::Map(new_array)))
429453
}
430454
Value::Column(Column::Map(col)) => {
455+
let validity = validity.map(|validity| {
456+
let mut inner_validity = MutableBitmap::with_capacity(col.len());
457+
inner_validity.extend_constant(col.len(), validity.get_bit(0));
458+
inner_validity.into()
459+
});
460+
431461
let new_col = self
432462
.run_cast(
433463
span,

tests/sqllogictests/suites/duckdb/sql/cast/double_float_cast.test

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,3 @@ Infinity
2121

2222
# ----
2323
# -Infinity
24-

tests/sqllogictests/suites/duckdb/sql/cast/float_integer_cast.test

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,3 @@
5959

6060
# ----
6161
# -2
62-

tests/sqllogictests/suites/duckdb/sql/cast/test_boolean_cast.test

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,4 +127,3 @@ query I
127127
SELECT CAST(CAST('0' AS BIGINT) AS BOOLEAN)
128128
----
129129
0
130-

tests/sqllogictests/suites/duckdb/sql/cast/test_exponent_in_cast.test

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,3 @@ SELECT CAST('1e1' AS DOUBLE)
3030

3131
# ----
3232
# 10.0
33-

tests/sqllogictests/suites/duckdb/sql/cast/test_string_cast.test

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,4 +78,3 @@ SELECT 2::DOUBLE::VARCHAR, 0.5::DOUBLE::VARCHAR, (-128.5)::DOUBLE::VARCHAR
7878

7979
# ----
8080
# 0
81-

tests/sqllogictests/suites/duckdb/sql/cast/test_try_cast.test

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,3 @@ query I
3434
SELECT try_cast(try_cast(try_cast as integer) as integer) FROM try_cast
3535
----
3636
3
37-

tests/sqllogictests/suites/duckdb/sql/cast/timestamp_date_cast.test

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,3 @@ statement error 1065
1111
select *
1212
from test
1313
where (t::date) = '2021-02-04'
14-

tests/sqllogictests/suites/query/functions/cast.test

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ select try_cast(3 as int);
2828
----
2929
3
3030

31+
3132
statement error
3233
select int_nullable::int from cast_test
3334

@@ -49,8 +50,24 @@ INSERT INTO t1(c1boolean, c0varchar) VALUES (true, '0')
4950
statement ok
5051
SELECT (false and NULL NOT IN (0.1, 0.2, 0.3,0.4)) ::BIGINT FROM t1,t0
5152

53+
54+
statement ok
55+
create table cast_array (t Array(String NULL) NULL )
56+
57+
statement ok
58+
insert into cast_array values([1,2]), ([1, 555])
59+
60+
query T
61+
select cast(t as Array(String) Null) from cast_array
62+
----
63+
['1','2']
64+
['1','555']
65+
5266
statement ok
5367
drop table t0
5468

69+
statement ok
70+
drop table cast_array
71+
5572
statement ok
5673
drop table t1

0 commit comments

Comments
 (0)