fix: Use `as_expr` vs `col` to avoid splitting identifiers with periods (#7011)
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>pull/24376/head
parent
b11228c72e
commit
b840ed0ad9
|
@ -2467,6 +2467,60 @@ mod tests {
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Fix to address [IDPE issue #17144][17144]
|
||||||
|
///
|
||||||
|
/// [17144]: https://github.com/influxdata/idpe/issues/17144
|
||||||
|
#[tokio::test]
|
||||||
|
async fn test_idpe_issue_17144() {
|
||||||
|
let chunk0 = Arc::new(
|
||||||
|
TestChunk::new("h2o")
|
||||||
|
.with_id(0)
|
||||||
|
.with_tag_column("foo")
|
||||||
|
.with_f64_field_column("foo.bar") // with period
|
||||||
|
.with_time_column(),
|
||||||
|
);
|
||||||
|
|
||||||
|
let executor = Arc::new(Executor::new_testing());
|
||||||
|
let test_db = Arc::new(TestDatabase::new(Arc::clone(&executor)));
|
||||||
|
test_db.add_chunk("my_partition_key", Arc::clone(&chunk0));
|
||||||
|
|
||||||
|
// verify that _field = 'foo.bar' is rewritten correctly
|
||||||
|
let predicate = Predicate::new().with_expr(
|
||||||
|
"_field"
|
||||||
|
.as_expr()
|
||||||
|
.eq(lit("foo.bar"))
|
||||||
|
.and("_value".as_expr().eq(lit(1.2))),
|
||||||
|
);
|
||||||
|
|
||||||
|
let rpc_predicate = InfluxRpcPredicate::new(None, predicate);
|
||||||
|
|
||||||
|
let agg = Aggregate::None;
|
||||||
|
let group_columns = &["foo"];
|
||||||
|
let res = InfluxRpcPlanner::new(IOxSessionContext::with_testing())
|
||||||
|
.read_group(Arc::clone(&test_db) as _, rpc_predicate, agg, group_columns)
|
||||||
|
.await
|
||||||
|
.expect("creating plan");
|
||||||
|
assert_eq!(res.plans.len(), 1);
|
||||||
|
let ssplan = res.plans.first().unwrap();
|
||||||
|
insta::assert_snapshot!(ssplan.plan.display_indent_schema().to_string(), @r###"
|
||||||
|
Projection: h2o.foo, CASE WHEN h2o.foo.bar = Float64(1.2) THEN h2o.foo.bar END AS foo.bar, h2o.time [foo:Dictionary(Int32, Utf8);N, foo.bar:Float64;N, time:Timestamp(Nanosecond, None)]
|
||||||
|
Sort: h2o.foo ASC NULLS FIRST, h2o.time ASC NULLS FIRST [foo:Dictionary(Int32, Utf8);N, foo.bar:Float64;N, time:Timestamp(Nanosecond, None)]
|
||||||
|
TableScan: h2o [foo:Dictionary(Int32, Utf8);N, foo.bar:Float64;N, time:Timestamp(Nanosecond, None)]
|
||||||
|
"###);
|
||||||
|
|
||||||
|
let got_predicate = test_db.get_chunks_predicate();
|
||||||
|
let exp_predicate = Predicate::new()
|
||||||
|
.with_field_columns(vec!["foo.bar"])
|
||||||
|
.with_value_expr(
|
||||||
|
"_value"
|
||||||
|
.as_expr()
|
||||||
|
.eq(lit(1.2))
|
||||||
|
.try_into()
|
||||||
|
.expect("failed to convert _value expression"),
|
||||||
|
);
|
||||||
|
assert_eq!(got_predicate, exp_predicate);
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn test_predicate_read_window_aggregate() {
|
async fn test_predicate_read_window_aggregate() {
|
||||||
run_test(|test_db, rpc_predicate| {
|
run_test(|test_db, rpc_predicate| {
|
||||||
|
|
|
@ -33,7 +33,7 @@ use datafusion::{
|
||||||
physical_optimizer::pruning::{PruningPredicate, PruningStatistics},
|
physical_optimizer::pruning::{PruningPredicate, PruningStatistics},
|
||||||
prelude::{col, lit_timestamp_nano, Expr},
|
prelude::{col, lit_timestamp_nano, Expr},
|
||||||
};
|
};
|
||||||
use datafusion_util::{make_range_expr, nullable_schema};
|
use datafusion_util::{make_range_expr, nullable_schema, AsExpr};
|
||||||
use observability_deps::tracing::debug;
|
use observability_deps::tracing::debug;
|
||||||
use rpc_predicate::VALUE_COLUMN_NAME;
|
use rpc_predicate::VALUE_COLUMN_NAME;
|
||||||
use schema::TIME_COLUMN_NAME;
|
use schema::TIME_COLUMN_NAME;
|
||||||
|
@ -585,7 +585,7 @@ impl ValueExpr {
|
||||||
/// column replaced with the specified column name
|
/// column replaced with the specified column name
|
||||||
pub fn replace_col(&self, name: &str) -> Expr {
|
pub fn replace_col(&self, name: &str) -> Expr {
|
||||||
if let Expr::BinaryExpr(BinaryExpr { left: _, op, right }) = &self.expr {
|
if let Expr::BinaryExpr(BinaryExpr { left: _, op, right }) = &self.expr {
|
||||||
binary_expr(col(name), *op, right.as_ref().clone())
|
binary_expr(name.as_expr(), *op, right.as_ref().clone())
|
||||||
} else {
|
} else {
|
||||||
unreachable!("Unexpected content in ValueExpr")
|
unreachable!("Unexpected content in ValueExpr")
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue