Skip to main content

uqa_sql/ast/
cte.rs

1//
2// Unified Query Algebra
3//
4// Copyright (c) 2023-2026 Cognica, Inc.
5//
6
7//! Common-table-expression syntax and recursive traversal controls.
8
9use serde::{Deserialize, Serialize};
10
11use super::{Expr, SelectStmt};
12
13#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
14pub struct CTE {
15    pub name: String,
16    pub columns: Vec<String>,
17    pub recursive: bool,
18    #[serde(default)]
19    pub materialization: CteMaterialization,
20    #[serde(default, skip_serializing_if = "Option::is_none")]
21    pub search: Option<CteSearchClause>,
22    #[serde(default, skip_serializing_if = "Option::is_none")]
23    pub cycle: Option<CteCycleClause>,
24    pub query: Box<SelectStmt>,
25}
26
27/// The planning fence requested for one common-table expression.
28#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
29pub enum CteMaterialization {
30    #[default]
31    Default,
32    Materialized,
33    NotMaterialized,
34}
35
36/// `PostgreSQL` recursive-CTE traversal-order metadata.
37#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
38pub struct CteSearchClause {
39    pub columns: Vec<String>,
40    pub breadth_first: bool,
41    pub sequence_column: String,
42}
43
44/// `PostgreSQL` recursive-CTE cycle detection metadata.
45#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
46pub struct CteCycleClause {
47    pub columns: Vec<String>,
48    pub mark_column: String,
49    pub mark_value: Expr,
50    pub mark_default: Expr,
51    pub path_column: String,
52}