Skip to main content

surrealdb_expr/expr/convert/
expression.rs

1//! `sql` -> `expr` conversions for [`crate::sql::expression`].
2//!
3//! Lives in core rather than beside the AST: `surrealdb-sql` sits below
4//! core, so it cannot name `expr` types.
5
6use crate::sql::Literal;
7use crate::sql::expression::*;
8
9impl From<Expr> for crate::expr::Expr {
10	fn from(v: Expr) -> Self {
11		match v {
12			Expr::Literal(l) => crate::expr::Expr::Literal(l.into()),
13			Expr::Param(p) => crate::expr::Expr::Param(p.into()),
14			Expr::Idiom(i) => crate::expr::Expr::Idiom(i.into()),
15			Expr::Table(t) => crate::expr::Expr::Table(t.into()),
16			Expr::Mock(m) => crate::expr::Expr::Mock(m.into()),
17			Expr::Block(b) => crate::expr::Expr::Block(Box::new((*b).into())),
18			Expr::Constant(c) => crate::expr::Expr::Constant(c.into()),
19			Expr::Prefix {
20				op,
21				expr,
22			} => crate::expr::Expr::Prefix {
23				op: op.into(),
24				expr: Box::new((*expr).into()),
25			},
26			Expr::Postfix {
27				op,
28				expr,
29			} => crate::expr::Expr::Postfix {
30				op: op.into(),
31				expr: Box::new((*expr).into()),
32			},
33
34			Expr::Binary {
35				left,
36				op,
37				right,
38			} => crate::expr::Expr::Binary {
39				left: Box::new((*left).into()),
40				op: op.into(),
41				right: Box::new((*right).into()),
42			},
43			Expr::FunctionCall(f) => crate::expr::Expr::FunctionCall(Box::new((*f).into())),
44			Expr::Closure(s) => crate::expr::Expr::Closure(Box::new((*s).into())),
45			Expr::Break => crate::expr::Expr::Break,
46			Expr::Continue => crate::expr::Expr::Continue,
47			Expr::Return(e) => crate::expr::Expr::Return(Box::new((*e).into())),
48			Expr::Throw(e) => crate::expr::Expr::Throw(Box::new((*e).into())),
49			Expr::IfElse(s) => crate::expr::Expr::IfElse(Box::new((*s).into())),
50			Expr::Select(s) => crate::expr::Expr::Select(Box::new((*s).into())),
51			Expr::Create(s) => crate::expr::Expr::Create(Box::new((*s).into())),
52			Expr::Update(s) => crate::expr::Expr::Update(Box::new((*s).into())),
53			Expr::Delete(s) => crate::expr::Expr::Delete(Box::new((*s).into())),
54			Expr::Relate(s) => crate::expr::Expr::Relate(Box::new((*s).into())),
55			Expr::Insert(s) => crate::expr::Expr::Insert(Box::new((*s).into())),
56			Expr::Define(s) => crate::expr::Expr::Define(Box::new((*s).into())),
57			Expr::Remove(s) => crate::expr::Expr::Remove(Box::new((*s).into())),
58			Expr::Rebuild(s) => crate::expr::Expr::Rebuild(Box::new((*s).into())),
59			Expr::Upsert(s) => crate::expr::Expr::Upsert(Box::new((*s).into())),
60			Expr::Alter(s) => crate::expr::Expr::Alter(Box::new((*s).into())),
61			Expr::Info(s) => crate::expr::Expr::Info(Box::new((*s).into())),
62			Expr::Foreach(s) => crate::expr::Expr::Foreach(Box::new((*s).into())),
63			Expr::Let(s) => crate::expr::Expr::Let(Box::new((*s).into())),
64			Expr::Sleep(s) => crate::expr::Expr::Sleep(Box::new((*s).into())),
65			Expr::Explain {
66				format,
67				analyze,
68				statement,
69			} => crate::expr::Expr::Explain {
70				format: format.into(),
71				analyze,
72				statement: Box::new((*statement).into()),
73			},
74		}
75	}
76}
77
78impl From<crate::expr::Expr> for Expr {
79	fn from(v: crate::expr::Expr) -> Self {
80		match v {
81			crate::expr::Expr::Literal(l) => Expr::Literal(l.into()),
82			crate::expr::Expr::Param(p) => Expr::Param(p.into()),
83			crate::expr::Expr::Idiom(i) => Expr::Idiom(i.into()),
84			crate::expr::Expr::Table(t) => Expr::Table(t.into()),
85			crate::expr::Expr::Mock(m) => Expr::Mock(m.into()),
86			crate::expr::Expr::Block(b) => Expr::Block(Box::new((*b).into())),
87			crate::expr::Expr::Constant(c) => Expr::Constant(c.into()),
88			crate::expr::Expr::Prefix {
89				op,
90				expr,
91			} => Expr::Prefix {
92				op: op.into(),
93				expr: Box::new((*expr).into()),
94			},
95			crate::expr::Expr::Postfix {
96				expr,
97				op,
98			} => Expr::Postfix {
99				expr: Box::new((*expr).into()),
100				op: op.into(),
101			},
102
103			crate::expr::Expr::Binary {
104				left,
105				op,
106				right,
107			} => Expr::Binary {
108				left: Box::new((*left).into()),
109				op: op.into(),
110				right: Box::new((*right).into()),
111			},
112			crate::expr::Expr::FunctionCall(f) => Expr::FunctionCall(Box::new((*f).into())),
113			crate::expr::Expr::Closure(s) => Expr::Closure(Box::new((*s).into())),
114			crate::expr::Expr::Break => Expr::Break,
115			crate::expr::Expr::Continue => Expr::Continue,
116			crate::expr::Expr::Return(e) => Expr::Return(Box::new((*e).into())),
117			crate::expr::Expr::Throw(e) => Expr::Throw(Box::new((*e).into())),
118			crate::expr::Expr::IfElse(s) => Expr::IfElse(Box::new((*s).into())),
119			crate::expr::Expr::Select(s) => Expr::Select(Box::new((*s).into())),
120			crate::expr::Expr::Create(s) => Expr::Create(Box::new((*s).into())),
121			crate::expr::Expr::Update(s) => Expr::Update(Box::new((*s).into())),
122			crate::expr::Expr::Delete(s) => Expr::Delete(Box::new((*s).into())),
123			crate::expr::Expr::Relate(s) => Expr::Relate(Box::new((*s).into())),
124			crate::expr::Expr::Insert(s) => Expr::Insert(Box::new((*s).into())),
125			crate::expr::Expr::Define(s) => Expr::Define(Box::new((*s).into())),
126			crate::expr::Expr::Remove(s) => Expr::Remove(Box::new((*s).into())),
127			crate::expr::Expr::Rebuild(s) => Expr::Rebuild(Box::new((*s).into())),
128			crate::expr::Expr::Upsert(s) => Expr::Upsert(Box::new((*s).into())),
129			crate::expr::Expr::Alter(s) => Expr::Alter(Box::new((*s).into())),
130			crate::expr::Expr::Info(s) => Expr::Info(Box::new((*s).into())),
131			crate::expr::Expr::Foreach(s) => Expr::Foreach(Box::new((*s).into())),
132			crate::expr::Expr::Let(s) => Expr::Let(Box::new((*s).into())),
133			crate::expr::Expr::Sleep(s) => Expr::Sleep(Box::new((*s).into())),
134			crate::expr::Expr::Explain {
135				format,
136				analyze,
137				statement,
138			} => Expr::Explain {
139				format: format.into(),
140				analyze,
141				statement: Box::new((*statement).into()),
142			},
143			// `Expr::Match` is only constructed by the GQL lowering at top level and
144			// never enters a `sql::Ast`, the catalog, or `Revisioned` serialization
145			// (which serializes `Expr` as SurrealQL text). It has no SurrealQL
146			// surface, so this conversion is unreachable by construction; emit a
147			// loud-but-non-panicking placeholder rather than a `sql::Match`.
148			crate::expr::Expr::Match(_) => {
149				tracing::error!(
150					"Expr::Match reached the sql::Expr conversion; it must never enter a \
151					 sql::Ast, the catalog, or Revisioned serialization"
152				);
153				debug_assert!(false, "Expr::Match must not be converted to sql::Expr");
154				Expr::Literal(Literal::None)
155			}
156		}
157	}
158}