Skip to main content

laminar_sql/
lib.rs

1//! LaminarDB SQL parser, planner, and DataFusion integration.
2
3#![deny(missing_docs)]
4#![warn(clippy::all, clippy::pedantic)]
5#![allow(clippy::module_name_repetitions)]
6#![allow(clippy::disallowed_types)] // cold path: SQL parsing and query planning only
7#![allow(clippy::doc_markdown)]
8#![allow(clippy::uninlined_format_args)]
9
10pub mod datafusion;
11pub mod error;
12pub mod parser;
13pub mod planner;
14pub mod translator;
15
16// Re-export key types
17pub use parser::{parse_streaming_sql, StreamingStatement};
18pub use planner::streaming_optimizer::{StreamingPhysicalValidator, StreamingValidatorMode};
19pub use planner::StreamingPlanner;
20pub use translator::{OrderOperatorConfig, WindowOperatorConfig, WindowType};
21
22// Re-export types
23pub use datafusion::execute::execute_streaming_sql;
24pub use datafusion::{
25    base_session_config, create_session_context, create_streaming_context_with_validator,
26    register_streaming_functions, register_streaming_functions_with_watermark, DdlResult,
27    QueryResult, StreamingSqlResult, WatermarkDynamicFilter,
28};
29
30/// Result type for SQL operations
31pub type Result<T> = std::result::Result<T, Error>;
32
33/// SQL-specific errors
34#[derive(Debug, thiserror::Error)]
35pub enum Error {
36    /// SQL parsing error
37    ParseError(#[from] parser::ParseError),
38
39    /// Planning error
40    PlanningError(#[from] planner::PlanningError),
41
42    /// `DataFusion` error (translated to user-friendly messages on display)
43    DataFusionError(#[from] datafusion_common::DataFusionError),
44
45    /// Unsupported SQL feature
46    UnsupportedFeature(String),
47}
48
49impl std::fmt::Display for Error {
50    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
51        match self {
52            Self::ParseError(e) => write!(f, "SQL parse error: {e}"),
53            Self::PlanningError(e) => write!(f, "Planning error: {e}"),
54            Self::DataFusionError(e) => {
55                let translated = error::translate_datafusion_error(&e.to_string());
56                write!(f, "{translated}")
57            }
58            Self::UnsupportedFeature(msg) => {
59                write!(f, "Unsupported feature: {msg}")
60            }
61        }
62    }
63}