From 98342184af068208c8639c296c4c4b323dfb87a9 Mon Sep 17 00:00:00 2001 From: Yong Studt <1240622744@qq.com> Date: Tue, 9 Jun 2026 11:59:49 +0800 Subject: [PATCH] feat(elasticsearch): translate SELECT * WHERE to ES DSL in-process (#910) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(elasticsearch): translate SELECT * WHERE to ES DSL in-process `SELECT *` with clauses our hand-written parser doesn't cover (WHERE, IN, BETWEEN, LIKE, IS NULL, ...) is now parsed with sqlparser-rs and translated to a /_search body locally — we no longer hand it off to ES's _sql endpoint. Why: _sql refuses several common shapes — LIKE on a text field with no .keyword sub-field (the typical filebeat / log-shipper mapping), and SELECT * over docs containing an array field like host.ip. Both translate cleanly to raw DSL. Going through _sql/translate doesn't help either — that lives in the same ES SQL engine and inherits the same restrictions. Translation: - field = 'v' → term - field LIKE 'prefix%' → prefix (optimised) - field LIKE '%x%' → wildcard, case_insensitive - field IN ('a','b') → terms - field BETWEEN a AND b → range gte/lte - field >/<>=/<= → range - field IS NULL / IS NOT NULL → bool.must_not.exists / exists - A AND B AND C → flattened bool.must - A OR B → bool.should, minimum_should_match: 1 - NOT A → bool.must_not - ORDER BY f ASC|DESC → sort - LIMIT N OFFSET M → size / from SQL LIKE patterns: % → *, _ → ?, backslash escapes preserved, user-written * / ? in patterns escaped back to literals. Input runs through the existing adapt_elasticsearch_sql_query first so hyphenated indices (filebeat-7.17.1-…) and @timestamp-style identifiers reach sqlparser as double-quoted identifiers. Also: 0-hit _search bodies now surface as an empty grid (with an _id column placeholder) instead of falling back to the raw status/response JSON view — `.filter(|h| !h.is_empty())` was masking the empty-result case. Adds docs/screenshot-es-sql-where.png demonstrating SELECT * with WHERE log.offset = N on a long field — would 400 through _sql, works through the in-process translator. Follows up on #874. * chore(test): fill ConnectionConfig::idle_timeout_secs in test fixtures After the new pub idle_timeout_secs: u64 field was added to ConnectionConfig, 11 #[cfg(test)] / tests fixture constructors still built the struct without it, so `cargo test --workspace --locked` and `cargo clippy --all-targets` would fail with E0063 against the test profile. `cargo check` alone passed because the lib path doesn't compile tests. Filled in with default_idle_timeout_secs() (matches the field's own #[serde(default = …)]) so future bumps to the default flow through automatically. --------- Co-authored-by: t8y2 <1156263951@qq.com> --- .../dbx-core/src/db/elasticsearch_driver.rs | 54 ++- crates/dbx-core/src/db/elasticsearch_sql.rs | 344 ++++++++++++++++++ crates/dbx-core/src/db/mod.rs | 1 + docs/screenshot-es-sql-where.png | Bin 0 -> 78870 bytes 4 files changed, 398 insertions(+), 1 deletion(-) create mode 100644 crates/dbx-core/src/db/elasticsearch_sql.rs create mode 100644 docs/screenshot-es-sql-where.png diff --git a/crates/dbx-core/src/db/elasticsearch_driver.rs b/crates/dbx-core/src/db/elasticsearch_driver.rs index 80ccf492be..3aeb5e4f5d 100644 --- a/crates/dbx-core/src/db/elasticsearch_driver.rs +++ b/crates/dbx-core/src/db/elasticsearch_driver.rs @@ -420,6 +420,24 @@ pub async fn execute_rest_query(client: &EsClient, input: &str) -> Result { + return execute_translated_select_star(client, translated, start).await; + } + Ok(None) => {} + Err(message) => return Err(format!("Elasticsearch SQL error: {message}")), + } + if is_elasticsearch_sql_query(input) { return execute_sql_query(client, input, start).await; } @@ -524,7 +542,10 @@ fn parse_elasticsearch_response( ) -> Result { if let Some(result) = parse_sql_response(&body, start) { Ok(result) - } else if let Some(hits) = body.pointer("/hits/hits").and_then(|v| v.as_array()).filter(|h| !h.is_empty()) { + } else if let Some(hits) = body.pointer("/hits/hits").and_then(|v| v.as_array()) { + // Treat any `_search`-shaped body as the hits result, even when empty — + // a 0-row match is a valid empty result, not a reason to fall back to + // the raw-JSON status/response view. let mut all_keys = Vec::::new(); let docs: Vec> = hits .iter() @@ -544,6 +565,11 @@ fn parse_elasticsearch_response( row }) .collect(); + if all_keys.is_empty() { + // 0 hits → there's no doc to derive columns from; surface `_id` + // so the grid at least shows a column header for the empty set. + all_keys.push("_id".to_string()); + } let rows: Vec> = docs .iter() @@ -713,6 +739,32 @@ fn is_elasticsearch_sql_query(input: &str) -> bool { .unwrap_or_else(|| input.trim_start().eq_ignore_ascii_case("select")) } +async fn execute_translated_select_star( + client: &EsClient, + translated: crate::db::elasticsearch_sql::TranslatedSelectStar, + start: std::time::Instant, +) -> Result { + let report_index_total = !translated.user_limited; + let path = format!("/{}/_search", translated.index); + let resp = client + .post(&path) + .json(&translated.body) + .send() + .await + .map_err(|e| format!("Elasticsearch request failed: {e}"))?; + let status = resp.status().as_u16(); + let body: serde_json::Value = resp.json().await.unwrap_or_else(|_| serde_json::Value::Null); + let index_total = body.pointer("/hits/total/value").and_then(|v| v.as_u64()); + + let mut result = parse_elasticsearch_response(status, body, start)?; + if report_index_total { + if let Some(total) = index_total { + result.affected_rows = total; + } + } + Ok(result) +} + async fn execute_sql_query( client: &EsClient, query: &str, diff --git a/crates/dbx-core/src/db/elasticsearch_sql.rs b/crates/dbx-core/src/db/elasticsearch_sql.rs new file mode 100644 index 0000000000..860659c610 --- /dev/null +++ b/crates/dbx-core/src/db/elasticsearch_sql.rs @@ -0,0 +1,344 @@ +// SQL → Elasticsearch `_search` DSL translator. +// +// ES SQL's `_sql` endpoint refuses several common shapes — `LIKE` on a `text` +// field with no `.keyword` sub-field, `SELECT *` returning an array field +// like `host.ip`, ... — even though the same intent is easy to express with +// the raw query DSL. So instead of delegating to ES SQL (or its +// `_sql/translate` cousin, which lives in the same engine), we parse the +// SQL ourselves with `sqlparser-rs` and emit a `_search` body. + +use serde_json::{json, Map, Value as Json}; +use sqlparser::ast::{ + BinaryOperator, Expr, OrderByExpr, OrderByKind, Query, Select, SelectItem, SetExpr, Statement, TableFactor, + UnaryOperator, Value as SqlValue, +}; +use sqlparser::dialect::GenericDialect; +use sqlparser::parser::Parser; + +const AUTO_PAGED_SELECT_STAR_SIZE: usize = 100; + +pub struct TranslatedSelectStar { + pub index: String, + pub body: Json, + /// User wrote `LIMIT N` (no OFFSET) — explicit row cap. + pub user_limited: bool, + /// SQL had OFFSET — signals this came from the pagination plan. + pub from_plan_pagination: bool, +} + +/// Try to translate a `SELECT * FROM [WHERE …] [ORDER BY …] +/// [LIMIT N] [OFFSET M]` statement into a `_search` body. +/// +/// Returns `Ok(None)` if the statement isn't a recognised `SELECT *` shape +/// (caller should fall back to a different path). Returns `Err` if it IS a +/// `SELECT *` but a clause is unsupported (so the caller surfaces a clear +/// error rather than silently downgrading). +pub fn translate_select_star(sql: &str) -> Result, String> { + let dialect = GenericDialect {}; + let statements = Parser::parse_sql(&dialect, sql).map_err(|e| format!("SQL parse error: {e}"))?; + let Some(stmt) = statements.first() else { + return Ok(None); + }; + let Statement::Query(query) = stmt else { + return Ok(None); + }; + let SetExpr::Select(select) = query.body.as_ref() else { + return Ok(None); + }; + if !is_select_star(select) { + return Ok(None); + } + let Some(index) = single_table_name(select)? else { + return Ok(None); + }; + + let mut body: Map = Map::new(); + if let Some(where_expr) = &select.selection { + body.insert("query".to_string(), translate_predicate(where_expr)?); + } + if let Some(order_by) = &query.order_by { + if let OrderByKind::Expressions(items) = &order_by.kind { + if let Some(sort) = translate_order_by(items)? { + body.insert("sort".to_string(), sort); + } + } + } + + let (limit, offset) = extract_limit_offset(query)?; + let user_limited = limit.is_some() && offset.is_none(); + let from_plan_pagination = offset.is_some(); + let effective_size = limit.unwrap_or(AUTO_PAGED_SELECT_STAR_SIZE); + let effective_from = offset.unwrap_or(0); + body.insert("size".to_string(), json!(effective_size)); + if effective_from > 0 { + body.insert("from".to_string(), json!(effective_from)); + } + + Ok(Some(TranslatedSelectStar { index, body: Json::Object(body), user_limited, from_plan_pagination })) +} + +fn is_select_star(select: &Select) -> bool { + select.projection.len() == 1 && matches!(select.projection.first(), Some(SelectItem::Wildcard(_))) +} + +fn single_table_name(select: &Select) -> Result, String> { + if select.from.len() != 1 { + return Ok(None); + } + let table = &select.from[0]; + if !table.joins.is_empty() { + return Err("JOINs are not supported in Elasticsearch SQL translation".to_string()); + } + let TableFactor::Table { name, .. } = &table.relation else { + return Ok(None); + }; + let joined = name + .0 + .iter() + .map(|part| match part { + sqlparser::ast::ObjectNamePart::Identifier(ident) => ident.value.clone(), + other => format!("{other}"), + }) + .collect::>() + .join("."); + Ok(Some(joined)) +} + +fn translate_predicate(expr: &Expr) -> Result { + match expr { + Expr::Nested(inner) => translate_predicate(inner), + Expr::BinaryOp { left, op, right } => translate_binary_op(left, op, right), + Expr::Like { negated, expr, pattern, .. } | Expr::ILike { negated, expr, pattern, .. } => { + translate_like(*negated, expr, pattern) + } + Expr::InList { expr, list, negated } => translate_in_list(expr, list, *negated), + Expr::IsNull(inner) => translate_is_null(inner, false), + Expr::IsNotNull(inner) => translate_is_null(inner, true), + Expr::Between { expr, negated, low, high } => translate_between(expr, *negated, low, high), + Expr::UnaryOp { op: UnaryOperator::Not, expr } => { + let inner = translate_predicate(expr)?; + Ok(json!({ "bool": { "must_not": [inner] } })) + } + other => Err(format!("Unsupported WHERE expression: {other}")), + } +} + +fn translate_binary_op(left: &Expr, op: &BinaryOperator, right: &Expr) -> Result { + match op { + BinaryOperator::And => { + let mut must = Vec::new(); + collect_and(left, &mut must)?; + collect_and(right, &mut must)?; + Ok(json!({ "bool": { "must": must } })) + } + BinaryOperator::Or => { + let mut should = Vec::new(); + collect_or(left, &mut should)?; + collect_or(right, &mut should)?; + Ok(json!({ "bool": { "should": should, "minimum_should_match": 1 } })) + } + BinaryOperator::Eq => term_clause(left, right), + BinaryOperator::NotEq => { + let inner = term_clause(left, right)?; + Ok(json!({ "bool": { "must_not": [inner] } })) + } + BinaryOperator::Gt => range_clause(left, right, "gt"), + BinaryOperator::Lt => range_clause(left, right, "lt"), + BinaryOperator::GtEq => range_clause(left, right, "gte"), + BinaryOperator::LtEq => range_clause(left, right, "lte"), + other => Err(format!("Unsupported operator: {other}")), + } +} + +fn collect_and(expr: &Expr, out: &mut Vec) -> Result<(), String> { + if let Expr::BinaryOp { left, op: BinaryOperator::And, right } = expr { + collect_and(left, out)?; + collect_and(right, out)?; + } else { + out.push(translate_predicate(expr)?); + } + Ok(()) +} + +fn collect_or(expr: &Expr, out: &mut Vec) -> Result<(), String> { + if let Expr::BinaryOp { left, op: BinaryOperator::Or, right } = expr { + collect_or(left, out)?; + collect_or(right, out)?; + } else { + out.push(translate_predicate(expr)?); + } + Ok(()) +} + +fn term_clause(left: &Expr, right: &Expr) -> Result { + let field = field_path(left)?; + let value = literal_to_json(right)?; + Ok(json!({ "term": { field: value } })) +} + +fn range_clause(left: &Expr, right: &Expr, key: &str) -> Result { + let field = field_path(left)?; + let value = literal_to_json(right)?; + Ok(json!({ "range": { field: { key: value } } })) +} + +fn translate_like(negated: bool, expr: &Expr, pattern: &Expr) -> Result { + let field = field_path(expr)?; + let pattern_str = match literal_string(pattern)? { + Some(s) => s, + None => return Err("LIKE pattern must be a string literal".to_string()), + }; + + // Optimise the common `prefix%` shape into a `prefix` query — cheaper than + // `wildcard` and supported on any analyzed text field. + let is_prefix = !pattern_str.starts_with('%') + && pattern_str.ends_with('%') + && !pattern_str[..pattern_str.len() - 1].contains(['%', '_']); + let query = if is_prefix { + let prefix = &pattern_str[..pattern_str.len() - 1]; + json!({ "prefix": { field: prefix } }) + } else { + let es_pattern = sql_like_to_wildcard(&pattern_str); + json!({ + "wildcard": { + field: { "value": es_pattern, "case_insensitive": true } + } + }) + }; + + if negated { + Ok(json!({ "bool": { "must_not": [query] } })) + } else { + Ok(query) + } +} + +fn translate_in_list(expr: &Expr, list: &[Expr], negated: bool) -> Result { + let field = field_path(expr)?; + let values: Vec = list.iter().map(literal_to_json).collect::>()?; + let query = json!({ "terms": { field: values } }); + if negated { + Ok(json!({ "bool": { "must_not": [query] } })) + } else { + Ok(query) + } +} + +fn translate_is_null(expr: &Expr, negated: bool) -> Result { + let field = field_path(expr)?; + let exists = json!({ "exists": { "field": field } }); + if negated { + // IS NOT NULL → field exists + Ok(exists) + } else { + Ok(json!({ "bool": { "must_not": [exists] } })) + } +} + +fn translate_between(expr: &Expr, negated: bool, low: &Expr, high: &Expr) -> Result { + let field = field_path(expr)?; + let lo = literal_to_json(low)?; + let hi = literal_to_json(high)?; + let query = json!({ "range": { field: { "gte": lo, "lte": hi } } }); + if negated { + Ok(json!({ "bool": { "must_not": [query] } })) + } else { + Ok(query) + } +} + +fn translate_order_by(items: &[OrderByExpr]) -> Result, String> { + let mut sort = Vec::new(); + for item in items { + let field = field_path(&item.expr)?; + let order = if item.options.asc.unwrap_or(true) { "asc" } else { "desc" }; + sort.push(json!({ field: { "order": order } })); + } + if sort.is_empty() { + Ok(None) + } else { + Ok(Some(Json::Array(sort))) + } +} + +fn extract_limit_offset(query: &Query) -> Result<(Option, Option), String> { + let limit = match &query.limit_clause { + Some(sqlparser::ast::LimitClause::LimitOffset { limit, .. }) => { + limit.as_ref().map(|expr| usize_literal(expr)).transpose()? + } + _ => None, + }; + let offset = match &query.limit_clause { + Some(sqlparser::ast::LimitClause::LimitOffset { offset: Some(off), .. }) => Some(usize_literal(&off.value)?), + _ => None, + }; + Ok((limit, offset)) +} + +fn usize_literal(expr: &Expr) -> Result { + match expr { + Expr::Value(v) => match &v.value { + SqlValue::Number(n, _) => n.parse::().map_err(|e| format!("Invalid number: {e}")), + other => Err(format!("Expected integer literal, got {other:?}")), + }, + other => Err(format!("Expected integer literal, got {other}")), + } +} + +fn field_path(expr: &Expr) -> Result { + match expr { + Expr::Identifier(ident) => Ok(ident.value.clone()), + Expr::CompoundIdentifier(parts) => Ok(parts.iter().map(|p| p.value.clone()).collect::>().join(".")), + other => Err(format!("Expected column name, got {other}")), + } +} + +fn literal_to_json(expr: &Expr) -> Result { + let Expr::Value(v) = expr else { + return Err(format!("Expected literal value, got {expr}")); + }; + match &v.value { + SqlValue::SingleQuotedString(s) | SqlValue::DoubleQuotedString(s) => Ok(Json::String(s.clone())), + SqlValue::Number(n, _) => serde_json::from_str::(n).map_err(|e| format!("Invalid number {n}: {e}")), + SqlValue::Boolean(b) => Ok(Json::Bool(*b)), + SqlValue::Null => Ok(Json::Null), + other => Err(format!("Unsupported literal: {other:?}")), + } +} + +fn literal_string(expr: &Expr) -> Result, String> { + let Expr::Value(v) = expr else { + return Err(format!("Expected string literal, got {expr}")); + }; + Ok(match &v.value { + SqlValue::SingleQuotedString(s) | SqlValue::DoubleQuotedString(s) => Some(s.clone()), + _ => None, + }) +} + +/// Convert SQL LIKE pattern to ES wildcard pattern. +/// SQL: `%` = any chars, `_` = single char. Backslash escapes both. +/// ES wildcard: `*` = any chars, `?` = single char. `\` escapes `*` / `?` / `\`. +fn sql_like_to_wildcard(pattern: &str) -> String { + let mut out = String::with_capacity(pattern.len()); + let mut chars = pattern.chars().peekable(); + while let Some(ch) = chars.next() { + match ch { + '\\' => { + if let Some(&next) = chars.peek() { + out.push(next); + chars.next(); + } + } + '%' => out.push('*'), + '_' => out.push('?'), + '*' | '?' => { + // Escape ES wildcard metacharacters that the user wrote literally. + out.push('\\'); + out.push(ch); + } + _ => out.push(ch), + } + } + out +} diff --git a/crates/dbx-core/src/db/mod.rs b/crates/dbx-core/src/db/mod.rs index 90151403a4..f6e32f295f 100644 --- a/crates/dbx-core/src/db/mod.rs +++ b/crates/dbx-core/src/db/mod.rs @@ -2,6 +2,7 @@ pub mod agent_driver; pub mod clickhouse_driver; pub mod duckdb_driver; pub mod elasticsearch_driver; +pub mod elasticsearch_sql; pub mod file_validator; pub mod mongo_driver; pub mod mysql; diff --git a/docs/screenshot-es-sql-where.png b/docs/screenshot-es-sql-where.png new file mode 100644 index 0000000000000000000000000000000000000000..87bd7621ba71fa919236d6dd10a1ac3dfc0d8bb1 GIT binary patch literal 78870 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 literal 0 HcmV?d00001