1use 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#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
29pub enum CteMaterialization {
30 #[default]
31 Default,
32 Materialized,
33 NotMaterialized,
34}
35
36#[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#[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}