Skip to content

Commit 6c9bfa7

Browse files
authored
fix(query): fix unnest variant array panic (#14688)
1 parent 4a386ea commit 6c9bfa7

File tree

2 files changed

+20
-27
lines changed

2 files changed

+20
-27
lines changed

src/query/functions/src/srfs/array.rs

Lines changed: 6 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -74,29 +74,6 @@ fn build_unnest(
7474
},
7575
})
7676
}
77-
DataType::Variant | DataType::Nullable(box DataType::Variant) => Arc::new(Function {
78-
signature: FunctionSignature {
79-
name: "unnest".to_string(),
80-
args_type: vec![wrap_type(DataType::Nullable(Box::new(DataType::Variant)))],
81-
return_type: DataType::Tuple(vec![DataType::Nullable(Box::new(DataType::Variant))]),
82-
},
83-
eval: FunctionEval::SRF {
84-
eval: Box::new(|args, ctx, max_nums_per_row| {
85-
let arg = args[0].clone().to_owned();
86-
(0..ctx.num_rows)
87-
.map(|row| match arg.index(row).unwrap() {
88-
ScalarRef::Null => {
89-
(Value::Scalar(Scalar::Tuple(vec![Scalar::Null])), 0)
90-
}
91-
ScalarRef::Variant(val) => {
92-
unnest_variant_array(val, row, max_nums_per_row)
93-
}
94-
_ => unreachable!(),
95-
})
96-
.collect()
97-
}),
98-
},
99-
}),
10077
DataType::Array(ty) => build_unnest(
10178
ty,
10279
Box::new(move |ty| wrap_type(DataType::Array(Box::new(ty)))),
@@ -138,12 +115,15 @@ fn build_unnest(
138115
ScalarRef::Null => {
139116
(Value::Scalar(Scalar::Tuple(vec![Scalar::Null])), 0)
140117
}
118+
ScalarRef::Variant(val) => {
119+
unnest_variant_array(val, row, max_nums_per_row)
120+
}
141121
ScalarRef::Array(col) => {
142122
let unnest_array = unnest_column(col);
143-
let array_len = unnest_array.len();
123+
let len = unnest_array.len();
144124
max_nums_per_row[row] =
145-
std::cmp::max(max_nums_per_row[row], array_len);
146-
(Value::Column(Column::Tuple(vec![unnest_array])), array_len)
125+
std::cmp::max(max_nums_per_row[row], len);
126+
(Value::Column(Column::Tuple(vec![unnest_array])), len)
147127
}
148128
_ => unreachable!(),
149129
}

tests/sqllogictests/suites/query/02_function/02_0062_function_unnest.test

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,19 @@ query T
479479
select unnest(parse_json('"a"'))
480480
----
481481

482+
query T
483+
select unnest([parse_json('{"tag":1, "val":10}'), parse_json('{"tag":12, "val":20, "foo":"bar"}')])
484+
----
485+
{"tag":1,"val":10}
486+
{"foo":"bar","tag":12,"val":20}
487+
488+
query T
489+
select unnest([[parse_json('[1,2,3]'), parse_json('false')],[parse_json('{"k":"v"}')]]);
490+
----
491+
[1,2,3]
492+
false
493+
{"k":"v"}
494+
482495
statement error 1065
483496
select unnest(max(11))
484497

@@ -492,4 +505,4 @@ statement ok
492505
set max_block_size = 65535;
493506

494507
statement ok
495-
set max_threads = 16;
508+
set max_threads = 16;

0 commit comments

Comments
 (0)