Skip to content

Commit

Permalink
Merge branch 'fix_eq_any_nullability' into array_subselect
Browse files Browse the repository at this point in the history
  • Loading branch information
Ten0 committed Nov 20, 2024
2 parents 7a5c5a8 + 80e8833 commit 6e4d7b7
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 3 deletions.
18 changes: 15 additions & 3 deletions diesel/src/expression/array_comparison.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ use crate::query_builder::{
};
use crate::result::QueryResult;
use crate::serialize::ToSql;
use crate::sql_types::{Bool, HasSqlType, SingleValue, SqlType};
use crate::sql_types::{self, HasSqlType, SingleValue, SqlType};
use std::marker::PhantomData;

/// Query dsl node that represents a `left IN (values)`
Expand Down Expand Up @@ -73,16 +73,28 @@ impl<T, U> Expression for In<T, U>
where
T: Expression,
U: InExpression<SqlType = T::SqlType>,
T::SqlType: SqlType,
sql_types::is_nullable::IsSqlTypeNullable<T::SqlType>:
sql_types::MaybeNullableType<sql_types::Bool>,
{
type SqlType = Bool;
type SqlType = sql_types::is_nullable::MaybeNullable<
sql_types::is_nullable::IsSqlTypeNullable<T::SqlType>,
sql_types::Bool,
>;
}

impl<T, U> Expression for NotIn<T, U>
where
T: Expression,
U: InExpression<SqlType = T::SqlType>,
T::SqlType: SqlType,
sql_types::is_nullable::IsSqlTypeNullable<T::SqlType>:
sql_types::MaybeNullableType<sql_types::Bool>,
{
type SqlType = Bool;
type SqlType = sql_types::is_nullable::MaybeNullable<
sql_types::is_nullable::IsSqlTypeNullable<T::SqlType>,
sql_types::Bool,
>;
}

impl<T, U, DB> QueryFragment<DB> for In<T, U>
Expand Down
20 changes: 20 additions & 0 deletions diesel_compile_tests/tests/fail/eq_any_is_nullable.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
extern crate diesel;

use diesel::*;

table! {
users{
id -> Integer,
name -> Nullable<Text>,
}
}

fn main() {
let mut conn = PgConnection::establish("").unwrap();
// Should not be allowed because `users::name` is nullable, so the result of `eq_any` is
// nullable as well.
let _: Vec<bool> = users::table
.select(users::name.eq_any(["foo", "bar"]))
.load(&mut conn)
.unwrap();
}

0 comments on commit 6e4d7b7

Please sign in to comment.