Skip to content

Commit 7b06ae6

Browse files
authored
refactor(query): refactor variant cast to types (#17435)
* refactor(query): refactor variant cast to types * fix match * fix match * fix match
1 parent da90d58 commit 7b06ae6

File tree

3 files changed

+25
-14
lines changed

3 files changed

+25
-14
lines changed

src/query/expression/src/evaluator.rs

+7-14
Original file line numberDiff line numberDiff line change
@@ -396,20 +396,13 @@ impl<'a> Evaluator<'a> {
396396
validity.clone(),
397397
options,
398398
)? {
399-
// remove wrapped null values.
400-
let new_value = match new_value {
401-
Value::Scalar(scalar) => {
402-
if scalar == Scalar::Null {
403-
Value::Scalar(Scalar::default_value(dest_type))
404-
} else {
405-
Value::Scalar(scalar)
406-
}
407-
}
408-
Value::Column(column) => {
409-
let nullable_column = column.as_nullable().unwrap();
410-
Value::Column(nullable_column.column.clone())
411-
}
412-
};
399+
let (new_value, has_null) = new_value.remove_nullable();
400+
if has_null {
401+
return Err(ErrorCode::BadArguments(format!(
402+
"unable to cast type `{src_type}` to type `{dest_type}`, result has null values"
403+
))
404+
.set_span(span));
405+
}
413406
Ok(new_value)
414407
} else {
415408
Err(ErrorCode::BadArguments(format!(

src/query/expression/src/values.rs

+12
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,18 @@ impl Value<AnyType> {
345345
}
346346
}
347347

348+
// returns result without nullable and has_null flag
349+
pub fn remove_nullable(self) -> (Self, bool) {
350+
match self {
351+
Value::Scalar(Scalar::Null) => (Value::Scalar(Scalar::Null), true),
352+
Value::Column(Column::Nullable(box nullable_column)) => (
353+
Value::Column(nullable_column.column),
354+
nullable_column.validity.null_count() > 0,
355+
),
356+
other => (other, false),
357+
}
358+
}
359+
348360
pub fn domain(&self, data_type: &DataType) -> Domain {
349361
match self {
350362
Value::Scalar(scalar) => scalar.as_ref().domain(data_type),

tests/sqllogictests/suites/base/03_common/03_0014_insert_into_select.test

+6
Original file line numberDiff line numberDiff line change
@@ -142,5 +142,11 @@ SELECT * FROM t5;
142142
{"user_id":1} 1
143143
{"user_id":2} 2
144144

145+
statement ok
146+
INSERT INTO t4 values('{}');
147+
148+
statement error
149+
INSERT INTO t5 SELECT data, data:user_id AS user_id FROM t4;
150+
145151
statement ok
146152
DROP DATABASE db1

0 commit comments

Comments
 (0)