(
args: &[ast::Expr],
idx: usize,
fn_name: &str,
catalog: &dyn SqlCatalog,
)
| 22 | } |
| 23 | |
| 24 | pub(super) fn require_array_name( |
| 25 | args: &[ast::Expr], |
| 26 | idx: usize, |
| 27 | fn_name: &str, |
| 28 | catalog: &dyn SqlCatalog, |
| 29 | ) -> Result<String> { |
| 30 | let expr = args.get(idx).ok_or_else(|| SqlError::Unsupported { |
| 31 | detail: format!("{fn_name}: missing array name at arg {idx}"), |
| 32 | })?; |
| 33 | let name = match expr { |
| 34 | ast::Expr::Identifier(ident) => normalize_ident(ident), |
| 35 | ast::Expr::CompoundIdentifier(parts) if parts.len() >= 2 => { |
| 36 | let qualified: String = parts |
| 37 | .iter() |
| 38 | .map(normalize_ident) |
| 39 | .collect::<Vec<_>>() |
| 40 | .join("."); |
| 41 | return Err(SqlError::Unsupported { |
| 42 | detail: format!( |
| 43 | "schema-qualified array name '{qualified}': {SCHEMA_QUALIFIED_MSG}" |
| 44 | ), |
| 45 | }); |
| 46 | } |
| 47 | _ => expect_string_literal(expr, &format!("{fn_name} array name"))?, |
| 48 | }; |
| 49 | if !catalog.array_exists(&name) { |
| 50 | return Err(SqlError::Unsupported { |
| 51 | detail: format!("{fn_name}: array '{name}' not found"), |
| 52 | }); |
| 53 | } |
| 54 | Ok(name) |
| 55 | } |
| 56 | |
| 57 | pub(super) fn expect_string_literal(expr: &ast::Expr, ctx: &str) -> Result<String> { |
| 58 | match expr { |
no test coverage detected