Skip to content

Commit

Permalink
refactor(query): refactor variant cast to types (#17435)
Browse files Browse the repository at this point in the history
* refactor(query): refactor variant cast to types

* fix match

* fix match

* fix match
  • Loading branch information
sundy-li authored Feb 11, 2025
1 parent da90d58 commit 7b06ae6
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 14 deletions.
21 changes: 7 additions & 14 deletions src/query/expression/src/evaluator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -396,20 +396,13 @@ impl<'a> Evaluator<'a> {
validity.clone(),
options,
)? {
// remove wrapped null values.
let new_value = match new_value {
Value::Scalar(scalar) => {
if scalar == Scalar::Null {
Value::Scalar(Scalar::default_value(dest_type))
} else {
Value::Scalar(scalar)
}
}
Value::Column(column) => {
let nullable_column = column.as_nullable().unwrap();
Value::Column(nullable_column.column.clone())
}
};
let (new_value, has_null) = new_value.remove_nullable();
if has_null {
return Err(ErrorCode::BadArguments(format!(
"unable to cast type `{src_type}` to type `{dest_type}`, result has null values"
))
.set_span(span));
}
Ok(new_value)
} else {
Err(ErrorCode::BadArguments(format!(
Expand Down
12 changes: 12 additions & 0 deletions src/query/expression/src/values.rs
Original file line number Diff line number Diff line change
Expand Up @@ -345,6 +345,18 @@ impl Value<AnyType> {
}
}

// returns result without nullable and has_null flag
pub fn remove_nullable(self) -> (Self, bool) {
match self {
Value::Scalar(Scalar::Null) => (Value::Scalar(Scalar::Null), true),
Value::Column(Column::Nullable(box nullable_column)) => (
Value::Column(nullable_column.column),
nullable_column.validity.null_count() > 0,
),
other => (other, false),
}
}

pub fn domain(&self, data_type: &DataType) -> Domain {
match self {
Value::Scalar(scalar) => scalar.as_ref().domain(data_type),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,5 +142,11 @@ SELECT * FROM t5;
{"user_id":1} 1
{"user_id":2} 2

statement ok
INSERT INTO t4 values('{}');

statement error
INSERT INTO t5 SELECT data, data:user_id AS user_id FROM t4;

statement ok
DROP DATABASE db1

0 comments on commit 7b06ae6

Please sign in to comment.