Skip to main content

nodedb_sql/planner/array_fn/
maint_fn.rs

1// SPDX-License-Identifier: Apache-2.0
2
3//! Maintenance ARRAY_* functions: bare `SELECT ARRAY_FLUSH(name)` /
4//! `SELECT ARRAY_COMPACT(name)` with no FROM clause.
5
6use sqlparser::ast;
7
8use super::helpers::{collect_args, require_array_name};
9use crate::error::Result;
10use crate::types::{SqlCatalog, SqlPlan};
11
12/// Try to intercept a no-FROM `SELECT array_flush(name)` /
13/// `SELECT array_compact(name)`. The single projection item must be
14/// a bare function call carrying one string-literal argument.
15pub fn try_plan_array_maint_fn(
16    items: &[ast::SelectItem],
17    catalog: &dyn SqlCatalog,
18) -> Result<Option<SqlPlan>> {
19    if items.len() != 1 {
20        return Ok(None);
21    }
22    let func = match &items[0] {
23        ast::SelectItem::UnnamedExpr(ast::Expr::Function(f))
24        | ast::SelectItem::ExprWithAlias {
25            expr: ast::Expr::Function(f),
26            ..
27        } => f,
28        _ => return Ok(None),
29    };
30    let fn_name = crate::parser::normalize::normalize_object_name_checked(&func.name)?;
31    let arg_exprs = match &func.args {
32        ast::FunctionArguments::List(list) => collect_args(&list.args),
33        _ => Vec::new(),
34    };
35    match fn_name.as_str() {
36        "array_flush" => {
37            let name = require_array_name(&arg_exprs, 0, "ARRAY_FLUSH", catalog)?;
38            Ok(Some(SqlPlan::ArrayFlush { name }))
39        }
40        "array_compact" => {
41            let name = require_array_name(&arg_exprs, 0, "ARRAY_COMPACT", catalog)?;
42            Ok(Some(SqlPlan::ArrayCompact { name }))
43        }
44        _ => Ok(None),
45    }
46}