diff --git a/vortex-duckdb/src/convert/expr.rs b/vortex-duckdb/src/convert/expr.rs index 149d0b1c750..a63c3478643 100644 --- a/vortex-duckdb/src/convert/expr.rs +++ b/vortex-duckdb/src/convert/expr.rs @@ -27,16 +27,15 @@ use vortex::error::VortexExpect; use vortex::error::VortexResult; use vortex::error::vortex_bail; use vortex::error::vortex_ensure_eq; -use vortex::error::vortex_err; use vortex::expr::Expression; use vortex::expr::and_collect; use vortex::expr::byte_length; use vortex::expr::cast; use vortex::expr::col; use vortex::expr::get_item; +use vortex::expr::in_list; use vortex::expr::is_not_null; use vortex::expr::is_null; -use vortex::expr::list_contains; use vortex::expr::list_length; use vortex::expr::lit; use vortex::expr::not; @@ -433,13 +432,20 @@ pub fn can_push_expression(value: &duckdb::ExpressionRef) -> bool { // columns are native. } ExpressionClass::BoundOperator(op) => { + if matches!( + op.op, + DUCKDB_VX_EXPR_TYPE::DUCKDB_VX_EXPR_TYPE_COMPARE_IN + | DUCKDB_VX_EXPR_TYPE::DUCKDB_VX_EXPR_TYPE_COMPARE_NOT_IN + ) { + let mut children = op.children(); + return children.next().is_some_and(can_push_expression) + && children.all(|child| matches!(child.as_class(), Some(BoundConstant(_)))); + } if !matches!( op.op, DUCKDB_VX_EXPR_TYPE::DUCKDB_VX_EXPR_TYPE_OPERATOR_NOT | DUCKDB_VX_EXPR_TYPE::DUCKDB_VX_EXPR_TYPE_OPERATOR_IS_NULL | DUCKDB_VX_EXPR_TYPE::DUCKDB_VX_EXPR_TYPE_OPERATOR_IS_NOT_NULL - | DUCKDB_VX_EXPR_TYPE::DUCKDB_VX_EXPR_TYPE_COMPARE_IN - | DUCKDB_VX_EXPR_TYPE::DUCKDB_VX_EXPR_TYPE_COMPARE_NOT_IN ) { return false; } @@ -729,24 +735,20 @@ fn try_from_compare_in( let Some(value) = try_from_expression_inner(c, ctx)? else { return Ok(None); }; - Ok(Some( - value - .as_opt::() - .ok_or_else(|| vortex_err!("cannot have a non literal in a in_list"))? - .clone(), - )) + Ok(value.as_opt::().cloned()) }) .collect::>>>()? else { return Ok(None); }; + // The IN list itself is never null. Null values are elements, and in_list handles them. let list = Scalar::list( Arc::new(list_elements[0].dtype().clone()), list_elements, - Nullability::Nullable, + Nullability::NonNullable, ); - let expr = list_contains(lit(list), element); + let expr = in_list(element, lit(list)); Ok(Some(if not_in { not(expr) } else { expr })) } diff --git a/vortex-duckdb/src/convert/table_filter.rs b/vortex-duckdb/src/convert/table_filter.rs index b527e9576e2..ed5763ce870 100644 --- a/vortex-duckdb/src/convert/table_filter.rs +++ b/vortex-duckdb/src/convert/table_filter.rs @@ -15,9 +15,9 @@ use vortex::error::vortex_err; use vortex::expr::Expression; use vortex::expr::and_collect; use vortex::expr::get_item; +use vortex::expr::in_list; use vortex::expr::is_not_null; use vortex::expr::is_null; -use vortex::expr::list_contains; use vortex::expr::lit; use vortex::expr::or_collect; use vortex::scalar::Scalar; @@ -81,16 +81,16 @@ pub fn try_from_table_filter( }); } TableFilterClass::InFilter(values) => { - // TODO(ngates): I'm pretty sure we actually need this as ScalarValue with the - // scope dtype let scalars: Vec<_> = values.iter().map(Scalar::try_from).try_collect()?; assert!( !scalars.is_empty(), "IN filter must have at least one value" ); let dtype = scalars[0].dtype().clone(); - let list_scalar = Scalar::list(Arc::new(dtype), scalars, Nullability::Nullable); - list_contains(lit(list_scalar), col.clone()) + // The IN list itself is never null. Null values are elements, and in_list handles + // them. + let list_scalar = Scalar::list(Arc::new(dtype), scalars, Nullability::NonNullable); + in_list(col.clone(), lit(list_scalar)) } TableFilterClass::Dynamic(dynamic) => { let op = match dynamic.operator { diff --git a/vortex-duckdb/src/e2e_test/vortex_scan_test.rs b/vortex-duckdb/src/e2e_test/vortex_scan_test.rs index e8c40346d24..265821842ba 100644 --- a/vortex-duckdb/src/e2e_test/vortex_scan_test.rs +++ b/vortex-duckdb/src/e2e_test/vortex_scan_test.rs @@ -18,6 +18,7 @@ use jiff::Zoned; use jiff::tz; use jiff::tz::TimeZone; use num_traits::AsPrimitive; +use rstest::rstest; use tempfile::NamedTempFile; use vortex::array::IntoArray; use vortex::array::VortexSessionExecute; @@ -280,6 +281,103 @@ fn test_vortex_scan_integers_between() { assert_eq!(sum, 43); } +fn assert_membership_filter_pushed( + conn: &Connection, + table: &str, + predicate: &str, + expected: i64, +) -> Result<()> { + let query = format!("SELECT count(*) FROM {table} WHERE {predicate}"); + let result = conn.query(&query)?; + let chunk = result.into_iter().next().unwrap(); + assert_eq!(chunk.get_vector(0).as_slice_with_len::(1), [expected]); + + let mut plan = String::new(); + for mut chunk in conn.query(&format!("EXPLAIN {query}"))? { + let len = chunk.len().as_(); + let vector = chunk.get_vector_mut(1); + for value in unsafe { vector.as_slice_mut::(len) } { + plan.push_str(&String::from_duckdb_value(value)); + } + } + // EXPLAIN wraps text inside a box, so search for a token that is short enough to stay on + // one line. + assert!( + plan.contains("sql_null_semantics"), + "missing membership filter:\n{plan}" + ); + assert!(!plan.contains("FILTER"), "filter was not pushed:\n{plan}"); + Ok(()) +} + +#[rstest] +#[case::in_list("number IN (1, 3)", 2)] +#[case::not_in_list("number NOT IN (1, 3)", 2)] +#[case::null_last("number IN (1, NULL)", 1)] +#[case::null_first("number IN (NULL, 1)", 1)] +#[case::not_in_null("number NOT IN (1, NULL)", 0)] +#[case::unknown("(number IN (1, NULL)) IS NULL", 4)] +#[case::known("(number IN (NULL, 1)) IS NOT NULL", 1)] +fn test_membership_filter_pushdown( + #[case] predicate: &str, + #[case] expected: i64, + #[values(false, true)] through_view: bool, +) -> Result<()> { + let file = RUNTIME.block_on(async { + let numbers = + PrimitiveArray::from_option_iter([Some(1i32), Some(2), Some(3), Some(4), None]); + write_single_column_vortex_file("number", numbers).await + }); + let conn = database_connection(); + let file_table = format!("'{}'", file.path().to_string_lossy()); + let table = if through_view { + conn.query(&format!( + "CREATE VIEW members AS SELECT * FROM {file_table}" + ))?; + "members" + } else { + file_table.as_str() + }; + assert_membership_filter_pushed(&conn, table, predicate, expected) +} + +#[test] +fn test_large_membership_filter_pushdown() -> Result<()> { + let file = RUNTIME.block_on(async { + let numbers = PrimitiveArray::from_option_iter([Some(1i32), Some(42), Some(1001), None]); + write_single_column_vortex_file("number", numbers).await + }); + let conn = database_connection(); + let members = (0..1000) + .map(|value| value.to_string()) + .collect::>() + .join(","); + assert_membership_filter_pushed( + &conn, + &format!("'{}'", file.path().to_string_lossy()), + &format!("number IN ({members})"), + 2, + ) +} + +#[test] +fn test_membership_with_nonconstant_list_stays_in_duckdb() -> Result<()> { + let file = RUNTIME.block_on(async { + let numbers = buffer![1i32, 2, 3]; + write_single_column_vortex_file("number", numbers).await + }); + let conn = database_connection(); + // Exercise the unsupported IN expression itself, before DuckDB expands it to comparisons. + conn.query("SET disabled_optimizers = 'in_clause'")?; + let result = conn.query(&format!( + "SELECT count(*) FROM '{}' WHERE number IN (number, 99)", + file.path().to_string_lossy(), + ))?; + let chunk = result.into_iter().next().unwrap(); + assert_eq!(chunk.get_vector(0).as_slice_with_len::(1), [3]); + Ok(()) +} + #[test] fn test_issue_5927_not_in_does_not_panic() { let file = RUNTIME.block_on(async { diff --git a/vortex-sqllogictest/slt/clickbench/duckdb/plans/q40.slt.no b/vortex-sqllogictest/slt/clickbench/duckdb/plans/q40.slt.no index ffba3cd4f30..dbe1b03753d 100644 --- a/vortex-sqllogictest/slt/clickbench/duckdb/plans/q40.slt.no +++ b/vortex-sqllogictest/slt/clickbench/duckdb/plans/q40.slt.no @@ -202,7 +202,7 @@ logical_opt [ "children": [], "extra_info": { "Filters": [ - "vortex.list.contains([-1i16, 6i16], $.TraficSourceID)", + "vortex.list.contains([-1i16, 6i16], $.TraficSourceID, opts=sql_null_semantics)", "($.CounterID = 62i32)", "(2013-07-01T00:00:00Z <= $.EventDate <= 2013-07-31T00:00:00Z)", "($.IsRefresh = 0i16)", diff --git a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q10.slt.no b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q10.slt.no index 09de4e841c9..f60c6ac2ee5 100644 --- a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q10.slt.no +++ b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q10.slt.no @@ -921,7 +921,7 @@ logical_opt [ "name": "READ_VORTEX", "children": [], "extra_info": { - "Filters": "vortex.list.contains([\"Rush County\", \"Toole County\", \"Jefferson County\", \"Dona Ana County\", \"La Porte County\"], $.ca_county)", + "Filters": "vortex.list.contains([\"Rush County\", \"Toole County\", \"Jefferson County\", \"Dona Ana County\", \"La Porte County\"], $.ca_county, opts=sql_null_semantics)", "Function": "Vortex Scan", "Estimated Cardinality": "1000" } @@ -1365,7 +1365,7 @@ physical_plan [ "children": [], "extra_info": { "Function": "Vortex Scan", - "Filters": "vortex.list.contains([\"Rush County\", \"Toole County\", \"Jefferson County\", \"Dona Ana County\", \"La Porte County\"], $.ca_county)", + "Filters": "vortex.list.contains([\"Rush County\", \"Toole County\", \"Jefferson County\", \"Dona Ana County\", \"La Porte County\"], $.ca_county, opts=sql_null_semantics)", "Projections": "ca_address_sk", "Estimated Cardinality": "1000" } diff --git a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q12.slt.no b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q12.slt.no index 7167dd1ab5d..cfca16c7127 100644 --- a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q12.slt.no +++ b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q12.slt.no @@ -313,7 +313,7 @@ logical_opt [ "name": "READ_VORTEX", "children": [], "extra_info": { - "Filters": "vortex.list.contains([\"Sports\", \"Books\", \"Home\"], $.i_category)", + "Filters": "vortex.list.contains([\"Sports\", \"Books\", \"Home\"], $.i_category, opts=sql_null_semantics)", "Function": "Vortex Scan", "Estimated Cardinality": "360" } @@ -479,7 +479,7 @@ physical_plan [ "children": [], "extra_info": { "Function": "Vortex Scan", - "Filters": "vortex.list.contains([\"Sports\", \"Books\", \"Home\"], $.i_category)", + "Filters": "vortex.list.contains([\"Sports\", \"Books\", \"Home\"], $.i_category, opts=sql_null_semantics)", "Projections": [ "i_item_sk", "i_item_id", diff --git a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q17.slt.no b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q17.slt.no index dd217bc2399..35e81f3f7f5 100644 --- a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q17.slt.no +++ b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q17.slt.no @@ -593,7 +593,7 @@ logical_opt [ "children": [], "extra_info": { "Filters": [ - "vortex.list.contains([\"2001Q1\", \"2001Q2\", \"2001Q3\"], $.d_quarter_name)", + "vortex.list.contains([\"2001Q1\", \"2001Q2\", \"2001Q3\"], $.d_quarter_name, opts=sql_null_semantics)", "(2450815i64 <= $.d_date_sk <= 2452652i64)" ], "Function": "Vortex Scan", @@ -741,7 +741,7 @@ logical_opt [ "children": [], "extra_info": { "Filters": [ - "vortex.list.contains([\"2001Q1\", \"2001Q2\", \"2001Q3\"], $.d_quarter_name)", + "vortex.list.contains([\"2001Q1\", \"2001Q2\", \"2001Q3\"], $.d_quarter_name, opts=sql_null_semantics)", "(2450821i64 <= $.d_date_sk <= 2452820i64)" ], "Function": "Vortex Scan", @@ -900,7 +900,7 @@ physical_plan [ "extra_info": { "Function": "Vortex Scan", "Filters": [ - "vortex.list.contains([\"2001Q1\", \"2001Q2\", \"2001Q3\"], $.d_quarter_name)", + "vortex.list.contains([\"2001Q1\", \"2001Q2\", \"2001Q3\"], $.d_quarter_name, opts=sql_null_semantics)", "(2450815i64 <= $.d_date_sk <= 2452652i64)" ], "Projections": "d_date_sk", @@ -1002,7 +1002,7 @@ physical_plan [ "extra_info": { "Function": "Vortex Scan", "Filters": [ - "vortex.list.contains([\"2001Q1\", \"2001Q2\", \"2001Q3\"], $.d_quarter_name)", + "vortex.list.contains([\"2001Q1\", \"2001Q2\", \"2001Q3\"], $.d_quarter_name, opts=sql_null_semantics)", "(2450821i64 <= $.d_date_sk <= 2452820i64)" ], "Projections": "d_date_sk", diff --git a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q18.slt.no b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q18.slt.no index 16d96cfb2d2..6bc75d0e1d4 100644 --- a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q18.slt.no +++ b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q18.slt.no @@ -607,7 +607,7 @@ logical_opt [ "name": "READ_VORTEX", "children": [], "extra_info": { - "Filters": "vortex.list.contains([1i64, 6i64, 8i64, 9i64, 12i64, 2i64], $.c_birth_month)", + "Filters": "vortex.list.contains([1i64, 6i64, 8i64, 9i64, 12i64, 2i64], $.c_birth_month, opts=sql_null_semantics)", "Function": "Vortex Scan", "Estimated Cardinality": "2000" } @@ -630,7 +630,7 @@ logical_opt [ "name": "READ_VORTEX", "children": [], "extra_info": { - "Filters": "vortex.list.contains([\"MS\", \"IN\", \"ND\", \"OK\", \"NM\", \"VA\", \"MS\"], $.ca_state)", + "Filters": "vortex.list.contains([\"MS\", \"IN\", \"ND\", \"OK\", \"NM\", \"VA\", \"MS\"], $.ca_state, opts=sql_null_semantics)", "Function": "Vortex Scan", "Estimated Cardinality": "1000" } @@ -833,7 +833,7 @@ physical_plan [ "children": [], "extra_info": { "Function": "Vortex Scan", - "Filters": "vortex.list.contains([1i64, 6i64, 8i64, 9i64, 12i64, 2i64], $.c_birth_month)", + "Filters": "vortex.list.contains([1i64, 6i64, 8i64, 9i64, 12i64, 2i64], $.c_birth_month, opts=sql_null_semantics)", "Projections": [ "c_customer_sk", "c_current_cdemo_sk", @@ -848,7 +848,7 @@ physical_plan [ "children": [], "extra_info": { "Function": "Vortex Scan", - "Filters": "vortex.list.contains([\"MS\", \"IN\", \"ND\", \"OK\", \"NM\", \"VA\", \"MS\"], $.ca_state)", + "Filters": "vortex.list.contains([\"MS\", \"IN\", \"ND\", \"OK\", \"NM\", \"VA\", \"MS\"], $.ca_state, opts=sql_null_semantics)", "Projections": [ "ca_address_sk", "ca_county", diff --git a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q20.slt.no b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q20.slt.no index 0cac60b6c2d..6c6d77503e5 100644 --- a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q20.slt.no +++ b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q20.slt.no @@ -313,7 +313,7 @@ logical_opt [ "name": "READ_VORTEX", "children": [], "extra_info": { - "Filters": "vortex.list.contains([\"Sports\", \"Books\", \"Home\"], $.i_category)", + "Filters": "vortex.list.contains([\"Sports\", \"Books\", \"Home\"], $.i_category, opts=sql_null_semantics)", "Function": "Vortex Scan", "Estimated Cardinality": "360" } @@ -479,7 +479,7 @@ physical_plan [ "children": [], "extra_info": { "Function": "Vortex Scan", - "Filters": "vortex.list.contains([\"Sports\", \"Books\", \"Home\"], $.i_category)", + "Filters": "vortex.list.contains([\"Sports\", \"Books\", \"Home\"], $.i_category, opts=sql_null_semantics)", "Projections": [ "i_item_sk", "i_item_id", diff --git a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q23.slt.no b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q23.slt.no index c97fb96b7ce..7f3b680efbe 100644 --- a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q23.slt.no +++ b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q23.slt.no @@ -1186,7 +1186,7 @@ logical_opt [ "children": [], "extra_info": { "Filters": [ - "vortex.list.contains([2000i64, 2001i64, 2002i64, 2003i64], $.d_year)", + "vortex.list.contains([2000i64, 2001i64, 2002i64, 2003i64], $.d_year, opts=sql_null_semantics)", "(2450816i64 <= $.d_date_sk <= 2452642i64)" ], "Function": "Vortex Scan", @@ -1445,7 +1445,7 @@ logical_opt [ "children": [], "extra_info": { "Filters": [ - "vortex.list.contains([2000i64, 2001i64, 2002i64, 2003i64], $.d_year)", + "vortex.list.contains([2000i64, 2001i64, 2002i64, 2003i64], $.d_year, opts=sql_null_semantics)", "(2450816i64 <= $.d_date_sk <= 2452642i64)" ], "Function": "Vortex Scan", @@ -1968,7 +1968,7 @@ physical_plan [ "extra_info": { "Function": "Vortex Scan", "Filters": [ - "vortex.list.contains([2000i64, 2001i64, 2002i64, 2003i64], $.d_year)", + "vortex.list.contains([2000i64, 2001i64, 2002i64, 2003i64], $.d_year, opts=sql_null_semantics)", "(2450816i64 <= $.d_date_sk <= 2452642i64)" ], "Projections": [ @@ -2182,7 +2182,7 @@ physical_plan [ "extra_info": { "Function": "Vortex Scan", "Filters": [ - "vortex.list.contains([2000i64, 2001i64, 2002i64, 2003i64], $.d_year)", + "vortex.list.contains([2000i64, 2001i64, 2002i64, 2003i64], $.d_year, opts=sql_null_semantics)", "(2450816i64 <= $.d_date_sk <= 2452642i64)" ], "Projections": "d_date_sk", diff --git a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q29.slt.no b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q29.slt.no index 74d7a252434..8680500dffd 100644 --- a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q29.slt.no +++ b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q29.slt.no @@ -785,7 +785,7 @@ logical_opt [ "children": [], "extra_info": { "Filters": [ - "vortex.list.contains([1999i64, 2000i64, 2001i64], $.d_year)", + "vortex.list.contains([1999i64, 2000i64, 2001i64], $.d_year, opts=sql_null_semantics)", "(2450815i64 <= $.d_date_sk <= 2452652i64)" ], "Function": "Vortex Scan", @@ -1054,7 +1054,7 @@ physical_plan [ "extra_info": { "Function": "Vortex Scan", "Filters": [ - "vortex.list.contains([1999i64, 2000i64, 2001i64], $.d_year)", + "vortex.list.contains([1999i64, 2000i64, 2001i64], $.d_year, opts=sql_null_semantics)", "(2450815i64 <= $.d_date_sk <= 2452652i64)" ], "Projections": "d_date_sk", diff --git a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q33.slt.no b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q33.slt.no index af35f4bbc98..d78319e7d73 100644 --- a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q33.slt.no +++ b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q33.slt.no @@ -1210,7 +1210,7 @@ logical_opt [ "name": "READ_VORTEX", "children": [], "extra_info": { - "Filters": "vortex.list.contains([\"Electronics\"], $.i_category)", + "Filters": "vortex.list.contains([\"Electronics\"], $.i_category, opts=sql_null_semantics)", "Function": "Vortex Scan", "Estimated Cardinality": "360" } @@ -1431,7 +1431,7 @@ logical_opt [ "name": "READ_VORTEX", "children": [], "extra_info": { - "Filters": "vortex.list.contains([\"Electronics\"], $.i_category)", + "Filters": "vortex.list.contains([\"Electronics\"], $.i_category, opts=sql_null_semantics)", "Function": "Vortex Scan", "Estimated Cardinality": "360" } @@ -1652,7 +1652,7 @@ logical_opt [ "name": "READ_VORTEX", "children": [], "extra_info": { - "Filters": "vortex.list.contains([\"Electronics\"], $.i_category)", + "Filters": "vortex.list.contains([\"Electronics\"], $.i_category, opts=sql_null_semantics)", "Function": "Vortex Scan", "Estimated Cardinality": "360" } @@ -1893,7 +1893,7 @@ physical_plan [ "children": [], "extra_info": { "Function": "Vortex Scan", - "Filters": "vortex.list.contains([\"Electronics\"], $.i_category)", + "Filters": "vortex.list.contains([\"Electronics\"], $.i_category, opts=sql_null_semantics)", "Projections": "i_manufact_id", "Estimated Cardinality": "360" } @@ -2037,7 +2037,7 @@ physical_plan [ "children": [], "extra_info": { "Function": "Vortex Scan", - "Filters": "vortex.list.contains([\"Electronics\"], $.i_category)", + "Filters": "vortex.list.contains([\"Electronics\"], $.i_category, opts=sql_null_semantics)", "Projections": "i_manufact_id", "Estimated Cardinality": "360" } @@ -2181,7 +2181,7 @@ physical_plan [ "children": [], "extra_info": { "Function": "Vortex Scan", - "Filters": "vortex.list.contains([\"Electronics\"], $.i_category)", + "Filters": "vortex.list.contains([\"Electronics\"], $.i_category, opts=sql_null_semantics)", "Projections": "i_manufact_id", "Estimated Cardinality": "360" } diff --git a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q34.slt.no b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q34.slt.no index 3e2e75f2035..60d511f95c7 100644 --- a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q34.slt.no +++ b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q34.slt.no @@ -422,7 +422,7 @@ logical_opt [ "extra_info": { "Filters": [ "((($.d_dom >= 1i64) and ($.d_dom <= 3i64)) or (($.d_dom >= 25i64) and ($.d_dom <= 28i64)))", - "vortex.list.contains([1999i64, 2000i64, 2001i64], $.d_year)", + "vortex.list.contains([1999i64, 2000i64, 2001i64], $.d_year, opts=sql_null_semantics)", "(2450816i64 <= $.d_date_sk <= 2452642i64)" ], "Function": "Vortex Scan", @@ -697,7 +697,7 @@ physical_plan [ "Function": "Vortex Scan", "Filters": [ "((($.d_dom >= 1i64) and ($.d_dom <= 3i64)) or (($.d_dom >= 25i64) and ($.d_dom <= 28i64)))", - "vortex.list.contains([1999i64, 2000i64, 2001i64], $.d_year)", + "vortex.list.contains([1999i64, 2000i64, 2001i64], $.d_year, opts=sql_null_semantics)", "(2450816i64 <= $.d_date_sk <= 2452642i64)" ], "Projections": "d_date_sk", diff --git a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q37.slt.no b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q37.slt.no index 0d854d7581f..e8f28d31eff 100644 --- a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q37.slt.no +++ b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q37.slt.no @@ -368,7 +368,7 @@ logical_opt [ "children": [], "extra_info": { "Filters": [ - "vortex.list.contains([677i64, 940i64, 694i64, 808i64], $.i_manufact_id)", + "vortex.list.contains([677i64, 940i64, 694i64, 808i64], $.i_manufact_id, opts=sql_null_semantics)", "(decimal128(6800, precision=7, scale=2) <= $.i_current_price <= decimal128(9800, precision=7, scale=2))" ], "Function": "Vortex Scan", @@ -519,7 +519,7 @@ physical_plan [ "extra_info": { "Function": "Vortex Scan", "Filters": [ - "vortex.list.contains([677i64, 940i64, 694i64, 808i64], $.i_manufact_id)", + "vortex.list.contains([677i64, 940i64, 694i64, 808i64], $.i_manufact_id, opts=sql_null_semantics)", "(decimal128(6800, precision=7, scale=2) <= $.i_current_price <= decimal128(9800, precision=7, scale=2))" ], "Projections": [ diff --git a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q45.slt.no b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q45.slt.no index c56cf22337b..1128ebf4408 100644 --- a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q45.slt.no +++ b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q45.slt.no @@ -580,7 +580,7 @@ logical_opt [ "name": "READ_VORTEX", "children": [], "extra_info": { - "Filters": "vortex.list.contains([2i64, 3i64, 5i64, 7i64, 11i64, 13i64, 17i64, 19i64, 23i64, 29i64], $.i_item_sk)", + "Filters": "vortex.list.contains([2i64, 3i64, 5i64, 7i64, 11i64, 13i64, 17i64, 19i64, 23i64, 29i64], $.i_item_sk, opts=sql_null_semantics)", "Function": "Vortex Scan", "Estimated Cardinality": "360" } @@ -783,7 +783,7 @@ physical_plan [ "children": [], "extra_info": { "Function": "Vortex Scan", - "Filters": "vortex.list.contains([2i64, 3i64, 5i64, 7i64, 11i64, 13i64, 17i64, 19i64, 23i64, 29i64], $.i_item_sk)", + "Filters": "vortex.list.contains([2i64, 3i64, 5i64, 7i64, 11i64, 13i64, 17i64, 19i64, 23i64, 29i64], $.i_item_sk, opts=sql_null_semantics)", "Projections": "i_item_id", "Estimated Cardinality": "360" } diff --git a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q46.slt.no b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q46.slt.no index 068f313a039..d23f62d91c0 100644 --- a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q46.slt.no +++ b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q46.slt.no @@ -515,8 +515,8 @@ logical_opt [ "children": [], "extra_info": { "Filters": [ - "vortex.list.contains([6i64, 0i64], $.d_dow)", - "vortex.list.contains([1999i64, 2000i64, 2001i64], $.d_year)", + "vortex.list.contains([6i64, 0i64], $.d_dow, opts=sql_null_semantics)", + "vortex.list.contains([1999i64, 2000i64, 2001i64], $.d_year, opts=sql_null_semantics)", "(2450816i64 <= $.d_date_sk <= 2452642i64)" ], "Function": "Vortex Scan", @@ -543,7 +543,7 @@ logical_opt [ "name": "READ_VORTEX", "children": [], "extra_info": { - "Filters": "vortex.list.contains([\"Fairview\", \"Midway\"], $.s_city)", + "Filters": "vortex.list.contains([\"Fairview\", \"Midway\"], $.s_city, opts=sql_null_semantics)", "Function": "Vortex Scan", "Estimated Cardinality": "1" } @@ -813,8 +813,8 @@ physical_plan [ "extra_info": { "Function": "Vortex Scan", "Filters": [ - "vortex.list.contains([6i64, 0i64], $.d_dow)", - "vortex.list.contains([1999i64, 2000i64, 2001i64], $.d_year)", + "vortex.list.contains([6i64, 0i64], $.d_dow, opts=sql_null_semantics)", + "vortex.list.contains([1999i64, 2000i64, 2001i64], $.d_year, opts=sql_null_semantics)", "(2450816i64 <= $.d_date_sk <= 2452642i64)" ], "Projections": "d_date_sk", @@ -833,7 +833,7 @@ physical_plan [ "children": [], "extra_info": { "Function": "Vortex Scan", - "Filters": "vortex.list.contains([\"Fairview\", \"Midway\"], $.s_city)", + "Filters": "vortex.list.contains([\"Fairview\", \"Midway\"], $.s_city, opts=sql_null_semantics)", "Projections": "s_store_sk", "Estimated Cardinality": "1" } diff --git a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q53.slt.no b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q53.slt.no index 4d41dbc710b..b7e5cbc0e8d 100644 --- a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q53.slt.no +++ b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q53.slt.no @@ -398,7 +398,7 @@ logical_opt [ "children": [], "extra_info": { "Filters": [ - "vortex.list.contains([1200i64, 1201i64, 1202i64, 1203i64, 1204i64, 1205i64, 1206i64, 1207i64, 1208i64, 1209i64, 1210i64, 1211i64], $.d_month_seq)", + "vortex.list.contains([1200i64, 1201i64, 1202i64, 1203i64, 1204i64, 1205i64, 1206i64, 1207i64, 1208i64, 1209i64, 1210i64, 1211i64], $.d_month_seq, opts=sql_null_semantics)", "(2450816i64 <= $.d_date_sk <= 2452642i64)" ], "Function": "Vortex Scan", @@ -454,10 +454,10 @@ logical_opt [ "children": [], "extra_info": { "Filters": [ - "(((vortex.list.contains([\"Books\", \"Children\", \"Electronics\"], $.i_category) and vortex.list.contains([\"personal\", \"portable\", \"reference\", \"self-help\"], $.i_class)) and vortex.list.contains([\"scholaramalgamalg #14\", \"scholaramalgamalg #7\", \"exportiunivamalg #9\", \"scholaramalgamalg #9\"], $.i_brand)) or ((vortex.list.contains([\"Women\", \"Music\", \"Men\"], $.i_category) and vortex.list.contains([\"accessories\", \"classical\", \"fragrances\", \"pants\"], $.i_class)) and vortex.list.contains([\"amalgimporto #1\", \"edu packscholar #1\", \"exportiimporto #1\", \"importoamalg #1\"], $.i_brand)))", - "(vortex.list.contains([\"Books\", \"Children\", \"Electronics\"], $.i_category) or vortex.list.contains([\"Women\", \"Music\", \"Men\"], $.i_category))", - "(vortex.list.contains([\"personal\", \"portable\", \"reference\", \"self-help\"], $.i_class) or vortex.list.contains([\"accessories\", \"classical\", \"fragrances\", \"pants\"], $.i_class))", - "(vortex.list.contains([\"scholaramalgamalg #14\", \"scholaramalgamalg #7\", \"exportiunivamalg #9\", \"scholaramalgamalg #9\"], $.i_brand) or vortex.list.contains([\"amalgimporto #1\", \"edu packscholar #1\", \"exportiimporto #1\", \"importoamalg #1\"], $.i_brand))" + "(((vortex.list.contains([\"Books\", \"Children\", \"Electronics\"], $.i_category, opts=sql_null_semantics) and vortex.list.contains([\"personal\", \"portable\", \"reference\", \"self-help\"], $.i_class, opts=sql_null_semantics)) and vortex.list.contains([\"scholaramalgamalg #14\", \"scholaramalgamalg #7\", \"exportiunivamalg #9\", \"scholaramalgamalg #9\"], $.i_brand, opts=sql_null_semantics)) or ((vortex.list.contains([\"Women\", \"Music\", \"Men\"], $.i_category, opts=sql_null_semantics) and vortex.list.contains([\"accessories\", \"classical\", \"fragrances\", \"pants\"], $.i_class, opts=sql_null_semantics)) and vortex.list.contains([\"amalgimporto #1\", \"edu packscholar #1\", \"exportiimporto #1\", \"importoamalg #1\"], $.i_brand, opts=sql_null_semantics)))", + "(vortex.list.contains([\"Books\", \"Children\", \"Electronics\"], $.i_category, opts=sql_null_semantics) or vortex.list.contains([\"Women\", \"Music\", \"Men\"], $.i_category, opts=sql_null_semantics))", + "(vortex.list.contains([\"personal\", \"portable\", \"reference\", \"self-help\"], $.i_class, opts=sql_null_semantics) or vortex.list.contains([\"accessories\", \"classical\", \"fragrances\", \"pants\"], $.i_class, opts=sql_null_semantics))", + "(vortex.list.contains([\"scholaramalgamalg #14\", \"scholaramalgamalg #7\", \"exportiunivamalg #9\", \"scholaramalgamalg #9\"], $.i_brand, opts=sql_null_semantics) or vortex.list.contains([\"amalgimporto #1\", \"edu packscholar #1\", \"exportiimporto #1\", \"importoamalg #1\"], $.i_brand, opts=sql_null_semantics))" ], "Function": "Vortex Scan", "Estimated Cardinality": "360" @@ -605,7 +605,7 @@ physical_plan [ "extra_info": { "Function": "Vortex Scan", "Filters": [ - "vortex.list.contains([1200i64, 1201i64, 1202i64, 1203i64, 1204i64, 1205i64, 1206i64, 1207i64, 1208i64, 1209i64, 1210i64, 1211i64], $.d_month_seq)", + "vortex.list.contains([1200i64, 1201i64, 1202i64, 1203i64, 1204i64, 1205i64, 1206i64, 1207i64, 1208i64, 1209i64, 1210i64, 1211i64], $.d_month_seq, opts=sql_null_semantics)", "(2450816i64 <= $.d_date_sk <= 2452642i64)" ], "Projections": [ @@ -644,10 +644,10 @@ physical_plan [ "extra_info": { "Function": "Vortex Scan", "Filters": [ - "(((vortex.list.contains([\"Books\", \"Children\", \"Electronics\"], $.i_category) and vortex.list.contains([\"personal\", \"portable\", \"reference\", \"self-help\"], $.i_class)) and vortex.list.contains([\"scholaramalgamalg #14\", \"scholaramalgamalg #7\", \"exportiunivamalg #9\", \"scholaramalgamalg #9\"], $.i_brand)) or ((vortex.list.contains([\"Women\", \"Music\", \"Men\"], $.i_category) and vortex.list.contains([\"accessories\", \"classical\", \"fragrances\", \"pants\"], $.i_class)) and vortex.list.contains([\"amalgimporto #1\", \"edu packscholar #1\", \"exportiimporto #1\", \"importoamalg #1\"], $.i_brand)))", - "(vortex.list.contains([\"Books\", \"Children\", \"Electronics\"], $.i_category) or vortex.list.contains([\"Women\", \"Music\", \"Men\"], $.i_category))", - "(vortex.list.contains([\"personal\", \"portable\", \"reference\", \"self-help\"], $.i_class) or vortex.list.contains([\"accessories\", \"classical\", \"fragrances\", \"pants\"], $.i_class))", - "(vortex.list.contains([\"scholaramalgamalg #14\", \"scholaramalgamalg #7\", \"exportiunivamalg #9\", \"scholaramalgamalg #9\"], $.i_brand) or vortex.list.contains([\"amalgimporto #1\", \"edu packscholar #1\", \"exportiimporto #1\", \"importoamalg #1\"], $.i_brand))" + "(((vortex.list.contains([\"Books\", \"Children\", \"Electronics\"], $.i_category, opts=sql_null_semantics) and vortex.list.contains([\"personal\", \"portable\", \"reference\", \"self-help\"], $.i_class, opts=sql_null_semantics)) and vortex.list.contains([\"scholaramalgamalg #14\", \"scholaramalgamalg #7\", \"exportiunivamalg #9\", \"scholaramalgamalg #9\"], $.i_brand, opts=sql_null_semantics)) or ((vortex.list.contains([\"Women\", \"Music\", \"Men\"], $.i_category, opts=sql_null_semantics) and vortex.list.contains([\"accessories\", \"classical\", \"fragrances\", \"pants\"], $.i_class, opts=sql_null_semantics)) and vortex.list.contains([\"amalgimporto #1\", \"edu packscholar #1\", \"exportiimporto #1\", \"importoamalg #1\"], $.i_brand, opts=sql_null_semantics)))", + "(vortex.list.contains([\"Books\", \"Children\", \"Electronics\"], $.i_category, opts=sql_null_semantics) or vortex.list.contains([\"Women\", \"Music\", \"Men\"], $.i_category, opts=sql_null_semantics))", + "(vortex.list.contains([\"personal\", \"portable\", \"reference\", \"self-help\"], $.i_class, opts=sql_null_semantics) or vortex.list.contains([\"accessories\", \"classical\", \"fragrances\", \"pants\"], $.i_class, opts=sql_null_semantics))", + "(vortex.list.contains([\"scholaramalgamalg #14\", \"scholaramalgamalg #7\", \"exportiunivamalg #9\", \"scholaramalgamalg #9\"], $.i_brand, opts=sql_null_semantics) or vortex.list.contains([\"amalgimporto #1\", \"edu packscholar #1\", \"exportiimporto #1\", \"importoamalg #1\"], $.i_brand, opts=sql_null_semantics))" ], "Projections": [ "i_item_sk", diff --git a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q56.slt.no b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q56.slt.no index 80d053ef631..89c2afa05ed 100644 --- a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q56.slt.no +++ b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q56.slt.no @@ -1208,7 +1208,7 @@ logical_opt [ "name": "READ_VORTEX", "children": [], "extra_info": { - "Filters": "vortex.list.contains([\"slate\", \"blanched\", \"burnished\"], $.i_color)", + "Filters": "vortex.list.contains([\"slate\", \"blanched\", \"burnished\"], $.i_color, opts=sql_null_semantics)", "Function": "Vortex Scan", "Estimated Cardinality": "360" } @@ -1405,7 +1405,7 @@ logical_opt [ "name": "READ_VORTEX", "children": [], "extra_info": { - "Filters": "vortex.list.contains([\"slate\", \"blanched\", \"burnished\"], $.i_color)", + "Filters": "vortex.list.contains([\"slate\", \"blanched\", \"burnished\"], $.i_color, opts=sql_null_semantics)", "Function": "Vortex Scan", "Estimated Cardinality": "360" } @@ -1602,7 +1602,7 @@ logical_opt [ "name": "READ_VORTEX", "children": [], "extra_info": { - "Filters": "vortex.list.contains([\"slate\", \"blanched\", \"burnished\"], $.i_color)", + "Filters": "vortex.list.contains([\"slate\", \"blanched\", \"burnished\"], $.i_color, opts=sql_null_semantics)", "Function": "Vortex Scan", "Estimated Cardinality": "360" } @@ -1795,7 +1795,7 @@ physical_plan [ "children": [], "extra_info": { "Function": "Vortex Scan", - "Filters": "vortex.list.contains([\"slate\", \"blanched\", \"burnished\"], $.i_color)", + "Filters": "vortex.list.contains([\"slate\", \"blanched\", \"burnished\"], $.i_color, opts=sql_null_semantics)", "Projections": "i_item_id", "Estimated Cardinality": "360" } @@ -1916,7 +1916,7 @@ physical_plan [ "children": [], "extra_info": { "Function": "Vortex Scan", - "Filters": "vortex.list.contains([\"slate\", \"blanched\", \"burnished\"], $.i_color)", + "Filters": "vortex.list.contains([\"slate\", \"blanched\", \"burnished\"], $.i_color, opts=sql_null_semantics)", "Projections": "i_item_id", "Estimated Cardinality": "360" } @@ -2037,7 +2037,7 @@ physical_plan [ "children": [], "extra_info": { "Function": "Vortex Scan", - "Filters": "vortex.list.contains([\"slate\", \"blanched\", \"burnished\"], $.i_color)", + "Filters": "vortex.list.contains([\"slate\", \"blanched\", \"burnished\"], $.i_color, opts=sql_null_semantics)", "Projections": "i_item_id", "Estimated Cardinality": "360" } diff --git a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q63.slt.no b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q63.slt.no index 0e4d88a3d00..8d40374b726 100644 --- a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q63.slt.no +++ b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q63.slt.no @@ -398,7 +398,7 @@ logical_opt [ "children": [], "extra_info": { "Filters": [ - "vortex.list.contains([1200i64, 1201i64, 1202i64, 1203i64, 1204i64, 1205i64, 1206i64, 1207i64, 1208i64, 1209i64, 1210i64, 1211i64], $.d_month_seq)", + "vortex.list.contains([1200i64, 1201i64, 1202i64, 1203i64, 1204i64, 1205i64, 1206i64, 1207i64, 1208i64, 1209i64, 1210i64, 1211i64], $.d_month_seq, opts=sql_null_semantics)", "(2450816i64 <= $.d_date_sk <= 2452642i64)" ], "Function": "Vortex Scan", @@ -454,10 +454,10 @@ logical_opt [ "children": [], "extra_info": { "Filters": [ - "(((vortex.list.contains([\"Books\", \"Children\", \"Electronics\"], $.i_category) and vortex.list.contains([\"personal\", \"portable\", \"reference\", \"self-help\"], $.i_class)) and vortex.list.contains([\"scholaramalgamalg #14\", \"scholaramalgamalg #7\", \"exportiunivamalg #9\", \"scholaramalgamalg #9\"], $.i_brand)) or ((vortex.list.contains([\"Women\", \"Music\", \"Men\"], $.i_category) and vortex.list.contains([\"accessories\", \"classical\", \"fragrances\", \"pants\"], $.i_class)) and vortex.list.contains([\"amalgimporto #1\", \"edu packscholar #1\", \"exportiimporto #1\", \"importoamalg #1\"], $.i_brand)))", - "(vortex.list.contains([\"Books\", \"Children\", \"Electronics\"], $.i_category) or vortex.list.contains([\"Women\", \"Music\", \"Men\"], $.i_category))", - "(vortex.list.contains([\"personal\", \"portable\", \"reference\", \"self-help\"], $.i_class) or vortex.list.contains([\"accessories\", \"classical\", \"fragrances\", \"pants\"], $.i_class))", - "(vortex.list.contains([\"scholaramalgamalg #14\", \"scholaramalgamalg #7\", \"exportiunivamalg #9\", \"scholaramalgamalg #9\"], $.i_brand) or vortex.list.contains([\"amalgimporto #1\", \"edu packscholar #1\", \"exportiimporto #1\", \"importoamalg #1\"], $.i_brand))" + "(((vortex.list.contains([\"Books\", \"Children\", \"Electronics\"], $.i_category, opts=sql_null_semantics) and vortex.list.contains([\"personal\", \"portable\", \"reference\", \"self-help\"], $.i_class, opts=sql_null_semantics)) and vortex.list.contains([\"scholaramalgamalg #14\", \"scholaramalgamalg #7\", \"exportiunivamalg #9\", \"scholaramalgamalg #9\"], $.i_brand, opts=sql_null_semantics)) or ((vortex.list.contains([\"Women\", \"Music\", \"Men\"], $.i_category, opts=sql_null_semantics) and vortex.list.contains([\"accessories\", \"classical\", \"fragrances\", \"pants\"], $.i_class, opts=sql_null_semantics)) and vortex.list.contains([\"amalgimporto #1\", \"edu packscholar #1\", \"exportiimporto #1\", \"importoamalg #1\"], $.i_brand, opts=sql_null_semantics)))", + "(vortex.list.contains([\"Books\", \"Children\", \"Electronics\"], $.i_category, opts=sql_null_semantics) or vortex.list.contains([\"Women\", \"Music\", \"Men\"], $.i_category, opts=sql_null_semantics))", + "(vortex.list.contains([\"personal\", \"portable\", \"reference\", \"self-help\"], $.i_class, opts=sql_null_semantics) or vortex.list.contains([\"accessories\", \"classical\", \"fragrances\", \"pants\"], $.i_class, opts=sql_null_semantics))", + "(vortex.list.contains([\"scholaramalgamalg #14\", \"scholaramalgamalg #7\", \"exportiunivamalg #9\", \"scholaramalgamalg #9\"], $.i_brand, opts=sql_null_semantics) or vortex.list.contains([\"amalgimporto #1\", \"edu packscholar #1\", \"exportiimporto #1\", \"importoamalg #1\"], $.i_brand, opts=sql_null_semantics))" ], "Function": "Vortex Scan", "Estimated Cardinality": "360" @@ -605,7 +605,7 @@ physical_plan [ "extra_info": { "Function": "Vortex Scan", "Filters": [ - "vortex.list.contains([1200i64, 1201i64, 1202i64, 1203i64, 1204i64, 1205i64, 1206i64, 1207i64, 1208i64, 1209i64, 1210i64, 1211i64], $.d_month_seq)", + "vortex.list.contains([1200i64, 1201i64, 1202i64, 1203i64, 1204i64, 1205i64, 1206i64, 1207i64, 1208i64, 1209i64, 1210i64, 1211i64], $.d_month_seq, opts=sql_null_semantics)", "(2450816i64 <= $.d_date_sk <= 2452642i64)" ], "Projections": [ @@ -644,10 +644,10 @@ physical_plan [ "extra_info": { "Function": "Vortex Scan", "Filters": [ - "(((vortex.list.contains([\"Books\", \"Children\", \"Electronics\"], $.i_category) and vortex.list.contains([\"personal\", \"portable\", \"reference\", \"self-help\"], $.i_class)) and vortex.list.contains([\"scholaramalgamalg #14\", \"scholaramalgamalg #7\", \"exportiunivamalg #9\", \"scholaramalgamalg #9\"], $.i_brand)) or ((vortex.list.contains([\"Women\", \"Music\", \"Men\"], $.i_category) and vortex.list.contains([\"accessories\", \"classical\", \"fragrances\", \"pants\"], $.i_class)) and vortex.list.contains([\"amalgimporto #1\", \"edu packscholar #1\", \"exportiimporto #1\", \"importoamalg #1\"], $.i_brand)))", - "(vortex.list.contains([\"Books\", \"Children\", \"Electronics\"], $.i_category) or vortex.list.contains([\"Women\", \"Music\", \"Men\"], $.i_category))", - "(vortex.list.contains([\"personal\", \"portable\", \"reference\", \"self-help\"], $.i_class) or vortex.list.contains([\"accessories\", \"classical\", \"fragrances\", \"pants\"], $.i_class))", - "(vortex.list.contains([\"scholaramalgamalg #14\", \"scholaramalgamalg #7\", \"exportiunivamalg #9\", \"scholaramalgamalg #9\"], $.i_brand) or vortex.list.contains([\"amalgimporto #1\", \"edu packscholar #1\", \"exportiimporto #1\", \"importoamalg #1\"], $.i_brand))" + "(((vortex.list.contains([\"Books\", \"Children\", \"Electronics\"], $.i_category, opts=sql_null_semantics) and vortex.list.contains([\"personal\", \"portable\", \"reference\", \"self-help\"], $.i_class, opts=sql_null_semantics)) and vortex.list.contains([\"scholaramalgamalg #14\", \"scholaramalgamalg #7\", \"exportiunivamalg #9\", \"scholaramalgamalg #9\"], $.i_brand, opts=sql_null_semantics)) or ((vortex.list.contains([\"Women\", \"Music\", \"Men\"], $.i_category, opts=sql_null_semantics) and vortex.list.contains([\"accessories\", \"classical\", \"fragrances\", \"pants\"], $.i_class, opts=sql_null_semantics)) and vortex.list.contains([\"amalgimporto #1\", \"edu packscholar #1\", \"exportiimporto #1\", \"importoamalg #1\"], $.i_brand, opts=sql_null_semantics)))", + "(vortex.list.contains([\"Books\", \"Children\", \"Electronics\"], $.i_category, opts=sql_null_semantics) or vortex.list.contains([\"Women\", \"Music\", \"Men\"], $.i_category, opts=sql_null_semantics))", + "(vortex.list.contains([\"personal\", \"portable\", \"reference\", \"self-help\"], $.i_class, opts=sql_null_semantics) or vortex.list.contains([\"accessories\", \"classical\", \"fragrances\", \"pants\"], $.i_class, opts=sql_null_semantics))", + "(vortex.list.contains([\"scholaramalgamalg #14\", \"scholaramalgamalg #7\", \"exportiunivamalg #9\", \"scholaramalgamalg #9\"], $.i_brand, opts=sql_null_semantics) or vortex.list.contains([\"amalgimporto #1\", \"edu packscholar #1\", \"exportiimporto #1\", \"importoamalg #1\"], $.i_brand, opts=sql_null_semantics))" ], "Projections": [ "i_item_sk", diff --git a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q64.slt.no b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q64.slt.no index 1565ec5d12b..d3f3e3c0517 100644 --- a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q64.slt.no +++ b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q64.slt.no @@ -1482,7 +1482,7 @@ logical_opt [ "children": [], "extra_info": { "Filters": [ - "vortex.list.contains([\"purple\", \"burlywood\", \"indian\", \"spring\", \"floral\", \"medium\"], $.i_color)", + "vortex.list.contains([\"purple\", \"burlywood\", \"indian\", \"spring\", \"floral\", \"medium\"], $.i_color, opts=sql_null_semantics)", "(decimal128(6500, precision=7, scale=2) <= $.i_current_price <= decimal128(7400, precision=7, scale=2))" ], "Function": "Vortex Scan", @@ -2335,7 +2335,7 @@ physical_plan [ "extra_info": { "Function": "Vortex Scan", "Filters": [ - "vortex.list.contains([\"purple\", \"burlywood\", \"indian\", \"spring\", \"floral\", \"medium\"], $.i_color)", + "vortex.list.contains([\"purple\", \"burlywood\", \"indian\", \"spring\", \"floral\", \"medium\"], $.i_color, opts=sql_null_semantics)", "(decimal128(6500, precision=7, scale=2) <= $.i_current_price <= decimal128(7400, precision=7, scale=2))" ], "Projections": [ diff --git a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q66.slt.no b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q66.slt.no index fcf37b76ffe..870c5d6cca8 100644 --- a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q66.slt.no +++ b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q66.slt.no @@ -1148,7 +1148,7 @@ logical_opt [ "name": "READ_VORTEX", "children": [], "extra_info": { - "Filters": "vortex.list.contains([\"DHL\", \"BARIAN\"], $.sm_carrier)", + "Filters": "vortex.list.contains([\"DHL\", \"BARIAN\"], $.sm_carrier, opts=sql_null_semantics)", "Function": "Vortex Scan", "Estimated Cardinality": "4" } @@ -1494,7 +1494,7 @@ logical_opt [ "name": "READ_VORTEX", "children": [], "extra_info": { - "Filters": "vortex.list.contains([\"DHL\", \"BARIAN\"], $.sm_carrier)", + "Filters": "vortex.list.contains([\"DHL\", \"BARIAN\"], $.sm_carrier, opts=sql_null_semantics)", "Function": "Vortex Scan", "Estimated Cardinality": "4" } @@ -2074,7 +2074,7 @@ physical_plan [ "children": [], "extra_info": { "Function": "Vortex Scan", - "Filters": "vortex.list.contains([\"DHL\", \"BARIAN\"], $.sm_carrier)", + "Filters": "vortex.list.contains([\"DHL\", \"BARIAN\"], $.sm_carrier, opts=sql_null_semantics)", "Projections": "sm_ship_mode_sk", "Estimated Cardinality": "4" } @@ -2416,7 +2416,7 @@ physical_plan [ "children": [], "extra_info": { "Function": "Vortex Scan", - "Filters": "vortex.list.contains([\"DHL\", \"BARIAN\"], $.sm_carrier)", + "Filters": "vortex.list.contains([\"DHL\", \"BARIAN\"], $.sm_carrier, opts=sql_null_semantics)", "Projections": "sm_ship_mode_sk", "Estimated Cardinality": "4" } diff --git a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q68.slt.no b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q68.slt.no index 2ed0c38e30d..3577151558c 100644 --- a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q68.slt.no +++ b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q68.slt.no @@ -515,7 +515,7 @@ logical_opt [ "children": [], "extra_info": { "Filters": [ - "vortex.list.contains([1999i64, 2000i64, 2001i64], $.d_year)", + "vortex.list.contains([1999i64, 2000i64, 2001i64], $.d_year, opts=sql_null_semantics)", "(1i64 <= $.d_dom <= 2i64)", "(2450816i64 <= $.d_date_sk <= 2452642i64)" ], @@ -543,7 +543,7 @@ logical_opt [ "name": "READ_VORTEX", "children": [], "extra_info": { - "Filters": "vortex.list.contains([\"Fairview\", \"Midway\"], $.s_city)", + "Filters": "vortex.list.contains([\"Fairview\", \"Midway\"], $.s_city, opts=sql_null_semantics)", "Function": "Vortex Scan", "Estimated Cardinality": "1" } @@ -819,7 +819,7 @@ physical_plan [ "extra_info": { "Function": "Vortex Scan", "Filters": [ - "vortex.list.contains([1999i64, 2000i64, 2001i64], $.d_year)", + "vortex.list.contains([1999i64, 2000i64, 2001i64], $.d_year, opts=sql_null_semantics)", "(1i64 <= $.d_dom <= 2i64)", "(2450816i64 <= $.d_date_sk <= 2452642i64)" ], @@ -839,7 +839,7 @@ physical_plan [ "children": [], "extra_info": { "Function": "Vortex Scan", - "Filters": "vortex.list.contains([\"Fairview\", \"Midway\"], $.s_city)", + "Filters": "vortex.list.contains([\"Fairview\", \"Midway\"], $.s_city, opts=sql_null_semantics)", "Projections": "s_store_sk", "Estimated Cardinality": "1" } diff --git a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q69.slt.no b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q69.slt.no index 1fc291edc40..23e1c611bd2 100644 --- a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q69.slt.no +++ b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q69.slt.no @@ -890,7 +890,7 @@ logical_opt [ "name": "READ_VORTEX", "children": [], "extra_info": { - "Filters": "vortex.list.contains([\"KY\", \"GA\", \"NM\"], $.ca_state)", + "Filters": "vortex.list.contains([\"KY\", \"GA\", \"NM\"], $.ca_state, opts=sql_null_semantics)", "Function": "Vortex Scan", "Estimated Cardinality": "1000" } @@ -1305,7 +1305,7 @@ physical_plan [ "children": [], "extra_info": { "Function": "Vortex Scan", - "Filters": "vortex.list.contains([\"KY\", \"GA\", \"NM\"], $.ca_state)", + "Filters": "vortex.list.contains([\"KY\", \"GA\", \"NM\"], $.ca_state, opts=sql_null_semantics)", "Projections": "ca_address_sk", "Estimated Cardinality": "1000" } diff --git a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q73.slt.no b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q73.slt.no index 45d85d20b43..9fb92dd2cbb 100644 --- a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q73.slt.no +++ b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q73.slt.no @@ -418,7 +418,7 @@ logical_opt [ "children": [], "extra_info": { "Filters": [ - "vortex.list.contains([1999i64, 2000i64, 2001i64], $.d_year)", + "vortex.list.contains([1999i64, 2000i64, 2001i64], $.d_year, opts=sql_null_semantics)", "(1i64 <= $.d_dom <= 2i64)", "(2450816i64 <= $.d_date_sk <= 2452642i64)" ], @@ -446,7 +446,7 @@ logical_opt [ "name": "READ_VORTEX", "children": [], "extra_info": { - "Filters": "vortex.list.contains([\"Orange County\", \"Bronx County\", \"Franklin Parish\", \"Williamson County\"], $.s_county)", + "Filters": "vortex.list.contains([\"Orange County\", \"Bronx County\", \"Franklin Parish\", \"Williamson County\"], $.s_county, opts=sql_null_semantics)", "Function": "Vortex Scan", "Estimated Cardinality": "1" } @@ -690,7 +690,7 @@ physical_plan [ "extra_info": { "Function": "Vortex Scan", "Filters": [ - "vortex.list.contains([1999i64, 2000i64, 2001i64], $.d_year)", + "vortex.list.contains([1999i64, 2000i64, 2001i64], $.d_year, opts=sql_null_semantics)", "(1i64 <= $.d_dom <= 2i64)", "(2450816i64 <= $.d_date_sk <= 2452642i64)" ], @@ -710,7 +710,7 @@ physical_plan [ "children": [], "extra_info": { "Function": "Vortex Scan", - "Filters": "vortex.list.contains([\"Orange County\", \"Bronx County\", \"Franklin Parish\", \"Williamson County\"], $.s_county)", + "Filters": "vortex.list.contains([\"Orange County\", \"Bronx County\", \"Franklin Parish\", \"Williamson County\"], $.s_county, opts=sql_null_semantics)", "Projections": "s_store_sk", "Estimated Cardinality": "1" } diff --git a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q74.slt.no b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q74.slt.no index a070cdcbb7e..8bc224d7d6a 100644 --- a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q74.slt.no +++ b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q74.slt.no @@ -616,7 +616,7 @@ logical_opt [ "children": [], "extra_info": { "Filters": [ - "vortex.list.contains([2001i64, 2002i64], $.d_year)", + "vortex.list.contains([2001i64, 2002i64], $.d_year, opts=sql_null_semantics)", "(($.d_year = 2001i64) or ($.d_year = 2002i64))", "(2450816i64 <= $.d_date_sk <= 2452642i64)" ], @@ -776,7 +776,7 @@ logical_opt [ "children": [], "extra_info": { "Filters": [ - "vortex.list.contains([2001i64, 2002i64], $.d_year)", + "vortex.list.contains([2001i64, 2002i64], $.d_year, opts=sql_null_semantics)", "(($.d_year = 2001i64) or ($.d_year = 2002i64))", "(2450816i64 <= $.d_date_sk <= 2452642i64)" ], @@ -1107,7 +1107,7 @@ physical_plan [ "extra_info": { "Function": "Vortex Scan", "Filters": [ - "vortex.list.contains([2001i64, 2002i64], $.d_year)", + "vortex.list.contains([2001i64, 2002i64], $.d_year, opts=sql_null_semantics)", "(($.d_year = 2001i64) or ($.d_year = 2002i64))", "(2450816i64 <= $.d_date_sk <= 2452642i64)" ], @@ -1256,7 +1256,7 @@ physical_plan [ "extra_info": { "Function": "Vortex Scan", "Filters": [ - "vortex.list.contains([2001i64, 2002i64], $.d_year)", + "vortex.list.contains([2001i64, 2002i64], $.d_year, opts=sql_null_semantics)", "(($.d_year = 2001i64) or ($.d_year = 2002i64))", "(2450816i64 <= $.d_date_sk <= 2452642i64)" ], diff --git a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q79.slt.no b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q79.slt.no index d8039b8e64f..efaf1b64db2 100644 --- a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q79.slt.no +++ b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q79.slt.no @@ -423,7 +423,7 @@ logical_opt [ "children": [], "extra_info": { "Filters": [ - "vortex.list.contains([1999i64, 2000i64, 2001i64], $.d_year)", + "vortex.list.contains([1999i64, 2000i64, 2001i64], $.d_year, opts=sql_null_semantics)", "($.d_dow = 1i64)", "(2450816i64 <= $.d_date_sk <= 2452642i64)" ], diff --git a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q82.slt.no b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q82.slt.no index f07598dc9ee..8deae7ff61b 100644 --- a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q82.slt.no +++ b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q82.slt.no @@ -357,7 +357,7 @@ logical_opt [ "children": [], "extra_info": { "Filters": [ - "vortex.list.contains([129i64, 270i64, 821i64, 423i64], $.i_manufact_id)", + "vortex.list.contains([129i64, 270i64, 821i64, 423i64], $.i_manufact_id, opts=sql_null_semantics)", "(decimal128(6200, precision=7, scale=2) <= $.i_current_price <= decimal128(9200, precision=7, scale=2))" ], "Function": "Vortex Scan", @@ -508,7 +508,7 @@ physical_plan [ "extra_info": { "Function": "Vortex Scan", "Filters": [ - "vortex.list.contains([129i64, 270i64, 821i64, 423i64], $.i_manufact_id)", + "vortex.list.contains([129i64, 270i64, 821i64, 423i64], $.i_manufact_id, opts=sql_null_semantics)", "(decimal128(6200, precision=7, scale=2) <= $.i_current_price <= decimal128(9200, precision=7, scale=2))" ], "Projections": [ diff --git a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q83.slt.no b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q83.slt.no index a4443b150a1..75d9f1b043a 100644 --- a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q83.slt.no +++ b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q83.slt.no @@ -1236,7 +1236,7 @@ logical_opt [ "name": "READ_VORTEX", "children": [], "extra_info": { - "Filters": "vortex.list.contains([2000-06-30, 2000-09-27, 2000-11-17], $.d_date)", + "Filters": "vortex.list.contains([2000-06-30, 2000-09-27, 2000-11-17], $.d_date, opts=sql_null_semantics)", "Function": "Vortex Scan", "Estimated Cardinality": "14609" } @@ -1468,7 +1468,7 @@ logical_opt [ "name": "READ_VORTEX", "children": [], "extra_info": { - "Filters": "vortex.list.contains([2000-06-30, 2000-09-27, 2000-11-17], $.d_date)", + "Filters": "vortex.list.contains([2000-06-30, 2000-09-27, 2000-11-17], $.d_date, opts=sql_null_semantics)", "Function": "Vortex Scan", "Estimated Cardinality": "14609" } @@ -1635,7 +1635,7 @@ logical_opt [ "name": "READ_VORTEX", "children": [], "extra_info": { - "Filters": "vortex.list.contains([2000-06-30, 2000-09-27, 2000-11-17], $.d_date)", + "Filters": "vortex.list.contains([2000-06-30, 2000-09-27, 2000-11-17], $.d_date, opts=sql_null_semantics)", "Function": "Vortex Scan", "Estimated Cardinality": "14609" } @@ -1898,7 +1898,7 @@ physical_plan [ "children": [], "extra_info": { "Function": "Vortex Scan", - "Filters": "vortex.list.contains([2000-06-30, 2000-09-27, 2000-11-17], $.d_date)", + "Filters": "vortex.list.contains([2000-06-30, 2000-09-27, 2000-11-17], $.d_date, opts=sql_null_semantics)", "Projections": "d_week_seq", "Estimated Cardinality": "14609" } @@ -2045,7 +2045,7 @@ physical_plan [ "children": [], "extra_info": { "Function": "Vortex Scan", - "Filters": "vortex.list.contains([2000-06-30, 2000-09-27, 2000-11-17], $.d_date)", + "Filters": "vortex.list.contains([2000-06-30, 2000-09-27, 2000-11-17], $.d_date, opts=sql_null_semantics)", "Projections": "d_week_seq", "Estimated Cardinality": "14609" } @@ -2145,7 +2145,7 @@ physical_plan [ "children": [], "extra_info": { "Function": "Vortex Scan", - "Filters": "vortex.list.contains([2000-06-30, 2000-09-27, 2000-11-17], $.d_date)", + "Filters": "vortex.list.contains([2000-06-30, 2000-09-27, 2000-11-17], $.d_date, opts=sql_null_semantics)", "Projections": "d_week_seq", "Estimated Cardinality": "14609" } diff --git a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q89.slt.no b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q89.slt.no index 051d489cbef..4e6279f2708 100644 --- a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q89.slt.no +++ b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q89.slt.no @@ -471,9 +471,9 @@ logical_opt [ "children": [], "extra_info": { "Filters": [ - "((vortex.list.contains([\"Books\", \"Electronics\", \"Sports\"], $.i_category) and vortex.list.contains([\"computers\", \"stereo\", \"football\"], $.i_class)) or (vortex.list.contains([\"Men\", \"Jewelry\", \"Women\"], $.i_category) and vortex.list.contains([\"shirts\", \"birdal\", \"dresses\"], $.i_class)))", - "(vortex.list.contains([\"Books\", \"Electronics\", \"Sports\"], $.i_category) or vortex.list.contains([\"Men\", \"Jewelry\", \"Women\"], $.i_category))", - "(vortex.list.contains([\"computers\", \"stereo\", \"football\"], $.i_class) or vortex.list.contains([\"shirts\", \"birdal\", \"dresses\"], $.i_class))" + "((vortex.list.contains([\"Books\", \"Electronics\", \"Sports\"], $.i_category, opts=sql_null_semantics) and vortex.list.contains([\"computers\", \"stereo\", \"football\"], $.i_class, opts=sql_null_semantics)) or (vortex.list.contains([\"Men\", \"Jewelry\", \"Women\"], $.i_category, opts=sql_null_semantics) and vortex.list.contains([\"shirts\", \"birdal\", \"dresses\"], $.i_class, opts=sql_null_semantics)))", + "(vortex.list.contains([\"Books\", \"Electronics\", \"Sports\"], $.i_category, opts=sql_null_semantics) or vortex.list.contains([\"Men\", \"Jewelry\", \"Women\"], $.i_category, opts=sql_null_semantics))", + "(vortex.list.contains([\"computers\", \"stereo\", \"football\"], $.i_class, opts=sql_null_semantics) or vortex.list.contains([\"shirts\", \"birdal\", \"dresses\"], $.i_class, opts=sql_null_semantics))" ], "Function": "Vortex Scan", "Estimated Cardinality": "360" @@ -704,9 +704,9 @@ physical_plan [ "extra_info": { "Function": "Vortex Scan", "Filters": [ - "((vortex.list.contains([\"Books\", \"Electronics\", \"Sports\"], $.i_category) and vortex.list.contains([\"computers\", \"stereo\", \"football\"], $.i_class)) or (vortex.list.contains([\"Men\", \"Jewelry\", \"Women\"], $.i_category) and vortex.list.contains([\"shirts\", \"birdal\", \"dresses\"], $.i_class)))", - "(vortex.list.contains([\"Books\", \"Electronics\", \"Sports\"], $.i_category) or vortex.list.contains([\"Men\", \"Jewelry\", \"Women\"], $.i_category))", - "(vortex.list.contains([\"computers\", \"stereo\", \"football\"], $.i_class) or vortex.list.contains([\"shirts\", \"birdal\", \"dresses\"], $.i_class))" + "((vortex.list.contains([\"Books\", \"Electronics\", \"Sports\"], $.i_category, opts=sql_null_semantics) and vortex.list.contains([\"computers\", \"stereo\", \"football\"], $.i_class, opts=sql_null_semantics)) or (vortex.list.contains([\"Men\", \"Jewelry\", \"Women\"], $.i_category, opts=sql_null_semantics) and vortex.list.contains([\"shirts\", \"birdal\", \"dresses\"], $.i_class, opts=sql_null_semantics)))", + "(vortex.list.contains([\"Books\", \"Electronics\", \"Sports\"], $.i_category, opts=sql_null_semantics) or vortex.list.contains([\"Men\", \"Jewelry\", \"Women\"], $.i_category, opts=sql_null_semantics))", + "(vortex.list.contains([\"computers\", \"stereo\", \"football\"], $.i_class, opts=sql_null_semantics) or vortex.list.contains([\"shirts\", \"birdal\", \"dresses\"], $.i_class, opts=sql_null_semantics))" ], "Projections": [ "i_item_sk", diff --git a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q98.slt.no b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q98.slt.no index 64074162d9d..7f547747a3d 100644 --- a/vortex-sqllogictest/slt/tpcds/duckdb/plans/q98.slt.no +++ b/vortex-sqllogictest/slt/tpcds/duckdb/plans/q98.slt.no @@ -293,7 +293,7 @@ logical_opt [ "name": "READ_VORTEX", "children": [], "extra_info": { - "Filters": "vortex.list.contains([\"Sports\", \"Books\", \"Home\"], $.i_category)", + "Filters": "vortex.list.contains([\"Sports\", \"Books\", \"Home\"], $.i_category, opts=sql_null_semantics)", "Function": "Vortex Scan", "Estimated Cardinality": "360" } @@ -464,7 +464,7 @@ physical_plan [ "children": [], "extra_info": { "Function": "Vortex Scan", - "Filters": "vortex.list.contains([\"Sports\", \"Books\", \"Home\"], $.i_category)", + "Filters": "vortex.list.contains([\"Sports\", \"Books\", \"Home\"], $.i_category, opts=sql_null_semantics)", "Projections": [ "i_item_sk", "i_item_id", diff --git a/vortex-sqllogictest/slt/tpch/duckdb/plans/q12.slt.no b/vortex-sqllogictest/slt/tpch/duckdb/plans/q12.slt.no index 8e15c7d76ae..a4b51eac027 100644 --- a/vortex-sqllogictest/slt/tpch/duckdb/plans/q12.slt.no +++ b/vortex-sqllogictest/slt/tpch/duckdb/plans/q12.slt.no @@ -192,7 +192,7 @@ logical_opt [ "children": [], "extra_info": { "Filters": [ - "vortex.list.contains([\"MAIL\", \"SHIP\"], $.l_shipmode)", + "vortex.list.contains([\"MAIL\", \"SHIP\"], $.l_shipmode, opts=sql_null_semantics)", "($.l_commitdate < $.l_receiptdate)", "($.l_shipdate < $.l_commitdate)", "(1994-01-01 <= $.l_receiptdate < 1995-01-01)", @@ -276,7 +276,7 @@ physical_plan [ "extra_info": { "Function": "Vortex Scan", "Filters": [ - "vortex.list.contains([\"MAIL\", \"SHIP\"], $.l_shipmode)", + "vortex.list.contains([\"MAIL\", \"SHIP\"], $.l_shipmode, opts=sql_null_semantics)", "($.l_commitdate < $.l_receiptdate)", "($.l_shipdate < $.l_commitdate)", "(1994-01-01 <= $.l_receiptdate < 1995-01-01)", diff --git a/vortex-sqllogictest/slt/tpch/duckdb/plans/q16.slt.no b/vortex-sqllogictest/slt/tpch/duckdb/plans/q16.slt.no index cc1d2592b91..a8aef74c8e3 100644 --- a/vortex-sqllogictest/slt/tpch/duckdb/plans/q16.slt.no +++ b/vortex-sqllogictest/slt/tpch/duckdb/plans/q16.slt.no @@ -255,7 +255,7 @@ logical_opt [ "extra_info": { "Filters": [ "vortex.not($.p_type like \"MEDIUM POLISHED%\")", - "vortex.list.contains([49i32, 14i32, 23i32, 45i32, 19i32, 3i32, 36i32, 9i32], $.p_size)", + "vortex.list.contains([49i32, 14i32, 23i32, 45i32, 19i32, 3i32, 36i32, 9i32], $.p_size, opts=sql_null_semantics)", "($.p_brand != \"Brand#45\")" ], "Function": "Vortex Scan", @@ -449,7 +449,7 @@ physical_plan [ "Function": "Vortex Scan", "Filters": [ "vortex.not($.p_type like \"MEDIUM POLISHED%\")", - "vortex.list.contains([49i32, 14i32, 23i32, 45i32, 19i32, 3i32, 36i32, 9i32], $.p_size)", + "vortex.list.contains([49i32, 14i32, 23i32, 45i32, 19i32, 3i32, 36i32, 9i32], $.p_size, opts=sql_null_semantics)", "($.p_brand != \"Brand#45\")" ], "Projections": [ diff --git a/vortex-sqllogictest/slt/tpch/duckdb/plans/q19.slt.no b/vortex-sqllogictest/slt/tpch/duckdb/plans/q19.slt.no index b04820de557..a8f2922c80b 100644 --- a/vortex-sqllogictest/slt/tpch/duckdb/plans/q19.slt.no +++ b/vortex-sqllogictest/slt/tpch/duckdb/plans/q19.slt.no @@ -180,7 +180,7 @@ logical_opt [ "children": [], "extra_info": { "Filters": [ - "vortex.list.contains([\"AIR\", \"AIR REG\"], $.l_shipmode)", + "vortex.list.contains([\"AIR\", \"AIR REG\"], $.l_shipmode, opts=sql_null_semantics)", "($.l_shipinstruct = \"DELIVER IN PERSON\")" ], "Function": "Vortex Scan",