@@ -17,7 +17,9 @@ use alloc::{
17
17
string:: { String , ToString } ,
18
18
vec:: Vec ,
19
19
} ;
20
+ use core:: borrow:: Borrow ;
20
21
use core:: fmt;
22
+ use std:: ops:: Deref ;
21
23
22
24
#[ cfg( feature = "serde" ) ]
23
25
use serde:: { Deserialize , Serialize } ;
@@ -44,6 +46,7 @@ pub use self::value::{
44
46
escape_quoted_string, DateTimeField , DollarQuotedString , TrimWhereField , Value ,
45
47
} ;
46
48
49
+ use crate :: tokenizer:: Span ;
47
50
#[ cfg( feature = "visitor" ) ]
48
51
pub use visitor:: * ;
49
52
@@ -251,6 +254,76 @@ impl fmt::Display for JsonOperator {
251
254
}
252
255
}
253
256
257
+ #[ derive( Debug , Clone , PartialEq , PartialOrd , Eq , Ord , Hash ) ]
258
+ pub struct WithSpan < T >
259
+ where
260
+ T : Clone + Eq + Ord + std:: hash:: Hash + PartialOrd + PartialEq ,
261
+ {
262
+ inner : T ,
263
+ span : Span ,
264
+ }
265
+
266
+ impl < T > WithSpan < T >
267
+ where
268
+ T : Clone + Eq + Ord + std:: hash:: Hash + PartialOrd + PartialEq ,
269
+ {
270
+ pub fn new ( inner : T , span : Span ) -> Self {
271
+ Self { inner, span }
272
+ }
273
+
274
+ pub fn unwrap ( self ) -> T {
275
+ self . inner
276
+ }
277
+ }
278
+
279
+ pub trait SpanWrapped : Clone + Eq + Ord + std:: hash:: Hash + PartialOrd + PartialEq {
280
+ fn spanning < U : Into < Span > > ( self , span : U ) -> WithSpan < Self > {
281
+ WithSpan :: new ( self , span. into ( ) )
282
+ }
283
+
284
+ fn empty_span ( self ) -> WithSpan < Self > {
285
+ self . spanning ( Span :: default ( ) )
286
+ }
287
+ }
288
+
289
+ impl < T > SpanWrapped for T
290
+ where
291
+ T : Clone + Eq + Ord + std:: hash:: Hash + PartialOrd + PartialEq ,
292
+ {
293
+ fn spanning < U : Into < Span > > ( self , span : U ) -> WithSpan < Self > {
294
+ WithSpan :: new ( self , span. into ( ) )
295
+ }
296
+ }
297
+
298
+ impl < T > Deref for WithSpan < T >
299
+ where
300
+ T : Clone + Eq + Ord + std:: hash:: Hash + PartialOrd + PartialEq ,
301
+ {
302
+ type Target = T ;
303
+
304
+ fn deref ( & self ) -> & Self :: Target {
305
+ & self . inner
306
+ }
307
+ }
308
+
309
+ impl < T > Borrow < T > for WithSpan < T >
310
+ where
311
+ T : Clone + Eq + Ord + std:: hash:: Hash + PartialOrd + PartialEq ,
312
+ {
313
+ fn borrow ( & self ) -> & T {
314
+ & self . inner
315
+ }
316
+ }
317
+
318
+ impl < T : fmt:: Display > fmt:: Display for WithSpan < T >
319
+ where
320
+ T : Clone + Eq + Ord + std:: hash:: Hash + PartialOrd + PartialEq ,
321
+ {
322
+ fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
323
+ write ! ( f, "{}" , self . inner)
324
+ }
325
+ }
326
+
254
327
/// An SQL expression of any type.
255
328
///
256
329
/// The parser does not distinguish between expressions of different types
@@ -265,7 +338,7 @@ impl fmt::Display for JsonOperator {
265
338
) ]
266
339
pub enum Expr {
267
340
/// Identifier e.g. table name or column name
268
- Identifier ( Ident ) ,
341
+ Identifier ( WithSpan < Ident > ) ,
269
342
/// Multi-part identifier, e.g. `table_alias.column` or `schema.table.col`
270
343
CompoundIdentifier ( Vec < Ident > ) ,
271
344
/// JSON access (postgres) eg: data->'tags'
@@ -4162,6 +4235,12 @@ impl fmt::Display for SearchModifier {
4162
4235
mod tests {
4163
4236
use super :: * ;
4164
4237
4238
+ fn ident < T : Into < String > > ( value : T ) -> WithSpan < Ident > {
4239
+ use crate :: ast:: SpanWrapped ;
4240
+
4241
+ SpanWrapped :: empty_span ( Ident :: new ( value) )
4242
+ }
4243
+
4165
4244
#[ test]
4166
4245
fn test_window_frame_default ( ) {
4167
4246
let window_frame = WindowFrame :: default ( ) ;
@@ -4172,84 +4251,72 @@ mod tests {
4172
4251
fn test_grouping_sets_display ( ) {
4173
4252
// a and b in different group
4174
4253
let grouping_sets = Expr :: GroupingSets ( vec ! [
4175
- vec![ Expr :: Identifier ( Ident :: new ( "a" ) ) ] ,
4176
- vec![ Expr :: Identifier ( Ident :: new ( "b" ) ) ] ,
4254
+ vec![ Expr :: Identifier ( ident ( "a" ) ) ] ,
4255
+ vec![ Expr :: Identifier ( ident ( "b" ) ) ] ,
4177
4256
] ) ;
4178
4257
assert_eq ! ( "GROUPING SETS ((a), (b))" , format!( "{grouping_sets}" ) ) ;
4179
4258
4180
4259
// a and b in the same group
4181
4260
let grouping_sets = Expr :: GroupingSets ( vec ! [ vec![
4182
- Expr :: Identifier ( Ident :: new ( "a" ) ) ,
4183
- Expr :: Identifier ( Ident :: new ( "b" ) ) ,
4261
+ Expr :: Identifier ( ident ( "a" ) ) ,
4262
+ Expr :: Identifier ( ident ( "b" ) ) ,
4184
4263
] ] ) ;
4185
4264
assert_eq ! ( "GROUPING SETS ((a, b))" , format!( "{grouping_sets}" ) ) ;
4186
4265
4187
4266
// (a, b) and (c, d) in different group
4188
4267
let grouping_sets = Expr :: GroupingSets ( vec ! [
4189
- vec![
4190
- Expr :: Identifier ( Ident :: new( "a" ) ) ,
4191
- Expr :: Identifier ( Ident :: new( "b" ) ) ,
4192
- ] ,
4193
- vec![
4194
- Expr :: Identifier ( Ident :: new( "c" ) ) ,
4195
- Expr :: Identifier ( Ident :: new( "d" ) ) ,
4196
- ] ,
4268
+ vec![ Expr :: Identifier ( ident( "a" ) ) , Expr :: Identifier ( ident( "b" ) ) ] ,
4269
+ vec![ Expr :: Identifier ( ident( "c" ) ) , Expr :: Identifier ( ident( "d" ) ) ] ,
4197
4270
] ) ;
4198
4271
assert_eq ! ( "GROUPING SETS ((a, b), (c, d))" , format!( "{grouping_sets}" ) ) ;
4199
4272
}
4200
4273
4201
4274
#[ test]
4202
4275
fn test_rollup_display ( ) {
4203
- let rollup = Expr :: Rollup ( vec ! [ vec![ Expr :: Identifier ( Ident :: new ( "a" ) ) ] ] ) ;
4276
+ let rollup = Expr :: Rollup ( vec ! [ vec![ Expr :: Identifier ( ident ( "a" ) ) ] ] ) ;
4204
4277
assert_eq ! ( "ROLLUP (a)" , format!( "{rollup}" ) ) ;
4205
4278
4206
4279
let rollup = Expr :: Rollup ( vec ! [ vec![
4207
- Expr :: Identifier ( Ident :: new ( "a" ) ) ,
4208
- Expr :: Identifier ( Ident :: new ( "b" ) ) ,
4280
+ Expr :: Identifier ( ident ( "a" ) ) ,
4281
+ Expr :: Identifier ( ident ( "b" ) ) ,
4209
4282
] ] ) ;
4210
4283
assert_eq ! ( "ROLLUP ((a, b))" , format!( "{rollup}" ) ) ;
4211
4284
4212
4285
let rollup = Expr :: Rollup ( vec ! [
4213
- vec![ Expr :: Identifier ( Ident :: new ( "a" ) ) ] ,
4214
- vec![ Expr :: Identifier ( Ident :: new ( "b" ) ) ] ,
4286
+ vec![ Expr :: Identifier ( ident ( "a" ) ) ] ,
4287
+ vec![ Expr :: Identifier ( ident ( "b" ) ) ] ,
4215
4288
] ) ;
4216
4289
assert_eq ! ( "ROLLUP (a, b)" , format!( "{rollup}" ) ) ;
4217
4290
4218
4291
let rollup = Expr :: Rollup ( vec ! [
4219
- vec![ Expr :: Identifier ( Ident :: new( "a" ) ) ] ,
4220
- vec![
4221
- Expr :: Identifier ( Ident :: new( "b" ) ) ,
4222
- Expr :: Identifier ( Ident :: new( "c" ) ) ,
4223
- ] ,
4224
- vec![ Expr :: Identifier ( Ident :: new( "d" ) ) ] ,
4292
+ vec![ Expr :: Identifier ( ident( "a" ) ) ] ,
4293
+ vec![ Expr :: Identifier ( ident( "b" ) ) , Expr :: Identifier ( ident( "c" ) ) ] ,
4294
+ vec![ Expr :: Identifier ( ident( "d" ) ) ] ,
4225
4295
] ) ;
4226
4296
assert_eq ! ( "ROLLUP (a, (b, c), d)" , format!( "{rollup}" ) ) ;
4227
4297
}
4228
4298
4229
4299
#[ test]
4230
4300
fn test_cube_display ( ) {
4231
- let cube = Expr :: Cube ( vec ! [ vec![ Expr :: Identifier ( Ident :: new ( "a" ) ) ] ] ) ;
4301
+ let cube = Expr :: Cube ( vec ! [ vec![ Expr :: Identifier ( ident ( "a" ) ) ] ] ) ;
4232
4302
assert_eq ! ( "CUBE (a)" , format!( "{cube}" ) ) ;
4233
4303
4234
4304
let cube = Expr :: Cube ( vec ! [ vec![
4235
- Expr :: Identifier ( Ident :: new ( "a" ) ) ,
4236
- Expr :: Identifier ( Ident :: new ( "b" ) ) ,
4305
+ Expr :: Identifier ( ident ( "a" ) ) ,
4306
+ Expr :: Identifier ( ident ( "b" ) ) ,
4237
4307
] ] ) ;
4238
4308
assert_eq ! ( "CUBE ((a, b))" , format!( "{cube}" ) ) ;
4239
4309
4240
4310
let cube = Expr :: Cube ( vec ! [
4241
- vec![ Expr :: Identifier ( Ident :: new ( "a" ) ) ] ,
4242
- vec![ Expr :: Identifier ( Ident :: new ( "b" ) ) ] ,
4311
+ vec![ Expr :: Identifier ( ident ( "a" ) ) ] ,
4312
+ vec![ Expr :: Identifier ( ident ( "b" ) ) ] ,
4243
4313
] ) ;
4244
4314
assert_eq ! ( "CUBE (a, b)" , format!( "{cube}" ) ) ;
4245
4315
4246
4316
let cube = Expr :: Cube ( vec ! [
4247
- vec![ Expr :: Identifier ( Ident :: new( "a" ) ) ] ,
4248
- vec![
4249
- Expr :: Identifier ( Ident :: new( "b" ) ) ,
4250
- Expr :: Identifier ( Ident :: new( "c" ) ) ,
4251
- ] ,
4252
- vec![ Expr :: Identifier ( Ident :: new( "d" ) ) ] ,
4317
+ vec![ Expr :: Identifier ( ident( "a" ) ) ] ,
4318
+ vec![ Expr :: Identifier ( ident( "b" ) ) , Expr :: Identifier ( ident( "c" ) ) ] ,
4319
+ vec![ Expr :: Identifier ( ident( "d" ) ) ] ,
4253
4320
] ) ;
4254
4321
assert_eq ! ( "CUBE (a, (b, c), d)" , format!( "{cube}" ) ) ;
4255
4322
}
0 commit comments