@@ -17,7 +17,10 @@ use alloc::{
17
17
string:: { String , ToString } ,
18
18
vec:: Vec ,
19
19
} ;
20
+
20
21
use core:: fmt:: { self , Display } ;
22
+ use core:: borrow:: Borrow ;
23
+ use std:: ops:: Deref ;
21
24
22
25
#[ cfg( feature = "serde" ) ]
23
26
use serde:: { Deserialize , Serialize } ;
@@ -45,9 +48,11 @@ pub use self::value::{
45
48
escape_quoted_string, DateTimeField , DollarQuotedString , TrimWhereField , Value ,
46
49
} ;
47
50
51
+
48
52
use crate :: ast:: helpers:: stmt_data_loading:: {
49
53
DataLoadingOptions , StageLoadSelectItem , StageParamsObject ,
50
54
} ;
55
+ use crate :: tokenizer:: Span ;
51
56
#[ cfg( feature = "visitor" ) ]
52
57
pub use visitor:: * ;
53
58
@@ -319,6 +324,78 @@ impl fmt::Display for JsonOperator {
319
324
}
320
325
}
321
326
327
+ #[ derive( Debug , Clone , PartialEq , PartialOrd , Eq , Ord , Hash ) ]
328
+ #[ cfg_attr( feature = "serde" , derive( Serialize , Deserialize ) ) ]
329
+ #[ cfg_attr( feature = "visitor" , derive( Visit , VisitMut ) ) ]
330
+ pub struct WithSpan < T >
331
+ where
332
+ T : Clone + Eq + Ord + std:: hash:: Hash + PartialOrd + PartialEq ,
333
+ {
334
+ inner : T ,
335
+ span : Span ,
336
+ }
337
+
338
+ impl < T > WithSpan < T >
339
+ where
340
+ T : Clone + Eq + Ord + std:: hash:: Hash + PartialOrd + PartialEq ,
341
+ {
342
+ pub fn new ( inner : T , span : Span ) -> Self {
343
+ Self { inner, span }
344
+ }
345
+
346
+ pub fn unwrap ( self ) -> T {
347
+ self . inner
348
+ }
349
+ }
350
+
351
+ pub trait SpanWrapped : Clone + Eq + Ord + std:: hash:: Hash + PartialOrd + PartialEq {
352
+ fn spanning < U : Into < Span > > ( self , span : U ) -> WithSpan < Self > {
353
+ WithSpan :: new ( self , span. into ( ) )
354
+ }
355
+
356
+ fn empty_span ( self ) -> WithSpan < Self > {
357
+ self . spanning ( Span :: default ( ) )
358
+ }
359
+ }
360
+
361
+ impl < T > SpanWrapped for T
362
+ where
363
+ T : Clone + Eq + Ord + std:: hash:: Hash + PartialOrd + PartialEq ,
364
+ {
365
+ fn spanning < U : Into < Span > > ( self , span : U ) -> WithSpan < Self > {
366
+ WithSpan :: new ( self , span. into ( ) )
367
+ }
368
+ }
369
+
370
+ impl < T > Deref for WithSpan < T >
371
+ where
372
+ T : Clone + Eq + Ord + std:: hash:: Hash + PartialOrd + PartialEq ,
373
+ {
374
+ type Target = T ;
375
+
376
+ fn deref ( & self ) -> & Self :: Target {
377
+ & self . inner
378
+ }
379
+ }
380
+
381
+ impl < T > Borrow < T > for WithSpan < T >
382
+ where
383
+ T : Clone + Eq + Ord + std:: hash:: Hash + PartialOrd + PartialEq ,
384
+ {
385
+ fn borrow ( & self ) -> & T {
386
+ & self . inner
387
+ }
388
+ }
389
+
390
+ impl < T : fmt:: Display > fmt:: Display for WithSpan < T >
391
+ where
392
+ T : Clone + Eq + Ord + std:: hash:: Hash + PartialOrd + PartialEq ,
393
+ {
394
+ fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
395
+ write ! ( f, "{}" , self . inner)
396
+ }
397
+ }
398
+
322
399
/// An SQL expression of any type.
323
400
///
324
401
/// The parser does not distinguish between expressions of different types
@@ -333,7 +410,7 @@ impl fmt::Display for JsonOperator {
333
410
) ]
334
411
pub enum Expr {
335
412
/// Identifier e.g. table name or column name
336
- Identifier ( Ident ) ,
413
+ Identifier ( WithSpan < Ident > ) ,
337
414
/// Multi-part identifier, e.g. `table_alias.column` or `schema.table.col`
338
415
CompoundIdentifier ( Vec < Ident > ) ,
339
416
/// JSON access (postgres) eg: data->'tags'
@@ -936,7 +1013,7 @@ impl fmt::Display for Expr {
936
1013
#[ cfg_attr( feature = "visitor" , derive( Visit , VisitMut ) ) ]
937
1014
pub enum WindowType {
938
1015
WindowSpec ( WindowSpec ) ,
939
- NamedWindow ( Ident ) ,
1016
+ NamedWindow ( WithSpan < Ident > ) ,
940
1017
}
941
1018
942
1019
impl Display for WindowType {
@@ -4415,6 +4492,10 @@ impl fmt::Display for SearchModifier {
4415
4492
mod tests {
4416
4493
use super :: * ;
4417
4494
4495
+ fn ident < T : Into < String > > ( value : T ) -> WithSpan < Ident > {
4496
+ SpanWrapped :: empty_span ( Ident :: new ( value) )
4497
+ }
4498
+
4418
4499
#[ test]
4419
4500
fn test_window_frame_default ( ) {
4420
4501
let window_frame = WindowFrame :: default ( ) ;
@@ -4425,84 +4506,72 @@ mod tests {
4425
4506
fn test_grouping_sets_display ( ) {
4426
4507
// a and b in different group
4427
4508
let grouping_sets = Expr :: GroupingSets ( vec ! [
4428
- vec![ Expr :: Identifier ( Ident :: new ( "a" ) ) ] ,
4429
- vec![ Expr :: Identifier ( Ident :: new ( "b" ) ) ] ,
4509
+ vec![ Expr :: Identifier ( ident ( "a" ) ) ] ,
4510
+ vec![ Expr :: Identifier ( ident ( "b" ) ) ] ,
4430
4511
] ) ;
4431
4512
assert_eq ! ( "GROUPING SETS ((a), (b))" , format!( "{grouping_sets}" ) ) ;
4432
4513
4433
4514
// a and b in the same group
4434
4515
let grouping_sets = Expr :: GroupingSets ( vec ! [ vec![
4435
- Expr :: Identifier ( Ident :: new ( "a" ) ) ,
4436
- Expr :: Identifier ( Ident :: new ( "b" ) ) ,
4516
+ Expr :: Identifier ( ident ( "a" ) ) ,
4517
+ Expr :: Identifier ( ident ( "b" ) ) ,
4437
4518
] ] ) ;
4438
4519
assert_eq ! ( "GROUPING SETS ((a, b))" , format!( "{grouping_sets}" ) ) ;
4439
4520
4440
4521
// (a, b) and (c, d) in different group
4441
4522
let grouping_sets = Expr :: GroupingSets ( vec ! [
4442
- vec![
4443
- Expr :: Identifier ( Ident :: new( "a" ) ) ,
4444
- Expr :: Identifier ( Ident :: new( "b" ) ) ,
4445
- ] ,
4446
- vec![
4447
- Expr :: Identifier ( Ident :: new( "c" ) ) ,
4448
- Expr :: Identifier ( Ident :: new( "d" ) ) ,
4449
- ] ,
4523
+ vec![ Expr :: Identifier ( ident( "a" ) ) , Expr :: Identifier ( ident( "b" ) ) ] ,
4524
+ vec![ Expr :: Identifier ( ident( "c" ) ) , Expr :: Identifier ( ident( "d" ) ) ] ,
4450
4525
] ) ;
4451
4526
assert_eq ! ( "GROUPING SETS ((a, b), (c, d))" , format!( "{grouping_sets}" ) ) ;
4452
4527
}
4453
4528
4454
4529
#[ test]
4455
4530
fn test_rollup_display ( ) {
4456
- let rollup = Expr :: Rollup ( vec ! [ vec![ Expr :: Identifier ( Ident :: new ( "a" ) ) ] ] ) ;
4531
+ let rollup = Expr :: Rollup ( vec ! [ vec![ Expr :: Identifier ( ident ( "a" ) ) ] ] ) ;
4457
4532
assert_eq ! ( "ROLLUP (a)" , format!( "{rollup}" ) ) ;
4458
4533
4459
4534
let rollup = Expr :: Rollup ( vec ! [ vec![
4460
- Expr :: Identifier ( Ident :: new ( "a" ) ) ,
4461
- Expr :: Identifier ( Ident :: new ( "b" ) ) ,
4535
+ Expr :: Identifier ( ident ( "a" ) ) ,
4536
+ Expr :: Identifier ( ident ( "b" ) ) ,
4462
4537
] ] ) ;
4463
4538
assert_eq ! ( "ROLLUP ((a, b))" , format!( "{rollup}" ) ) ;
4464
4539
4465
4540
let rollup = Expr :: Rollup ( vec ! [
4466
- vec![ Expr :: Identifier ( Ident :: new ( "a" ) ) ] ,
4467
- vec![ Expr :: Identifier ( Ident :: new ( "b" ) ) ] ,
4541
+ vec![ Expr :: Identifier ( ident ( "a" ) ) ] ,
4542
+ vec![ Expr :: Identifier ( ident ( "b" ) ) ] ,
4468
4543
] ) ;
4469
4544
assert_eq ! ( "ROLLUP (a, b)" , format!( "{rollup}" ) ) ;
4470
4545
4471
4546
let rollup = Expr :: Rollup ( vec ! [
4472
- vec![ Expr :: Identifier ( Ident :: new( "a" ) ) ] ,
4473
- vec![
4474
- Expr :: Identifier ( Ident :: new( "b" ) ) ,
4475
- Expr :: Identifier ( Ident :: new( "c" ) ) ,
4476
- ] ,
4477
- vec![ Expr :: Identifier ( Ident :: new( "d" ) ) ] ,
4547
+ vec![ Expr :: Identifier ( ident( "a" ) ) ] ,
4548
+ vec![ Expr :: Identifier ( ident( "b" ) ) , Expr :: Identifier ( ident( "c" ) ) ] ,
4549
+ vec![ Expr :: Identifier ( ident( "d" ) ) ] ,
4478
4550
] ) ;
4479
4551
assert_eq ! ( "ROLLUP (a, (b, c), d)" , format!( "{rollup}" ) ) ;
4480
4552
}
4481
4553
4482
4554
#[ test]
4483
4555
fn test_cube_display ( ) {
4484
- let cube = Expr :: Cube ( vec ! [ vec![ Expr :: Identifier ( Ident :: new ( "a" ) ) ] ] ) ;
4556
+ let cube = Expr :: Cube ( vec ! [ vec![ Expr :: Identifier ( ident ( "a" ) ) ] ] ) ;
4485
4557
assert_eq ! ( "CUBE (a)" , format!( "{cube}" ) ) ;
4486
4558
4487
4559
let cube = Expr :: Cube ( vec ! [ vec![
4488
- Expr :: Identifier ( Ident :: new ( "a" ) ) ,
4489
- Expr :: Identifier ( Ident :: new ( "b" ) ) ,
4560
+ Expr :: Identifier ( ident ( "a" ) ) ,
4561
+ Expr :: Identifier ( ident ( "b" ) ) ,
4490
4562
] ] ) ;
4491
4563
assert_eq ! ( "CUBE ((a, b))" , format!( "{cube}" ) ) ;
4492
4564
4493
4565
let cube = Expr :: Cube ( vec ! [
4494
- vec![ Expr :: Identifier ( Ident :: new ( "a" ) ) ] ,
4495
- vec![ Expr :: Identifier ( Ident :: new ( "b" ) ) ] ,
4566
+ vec![ Expr :: Identifier ( ident ( "a" ) ) ] ,
4567
+ vec![ Expr :: Identifier ( ident ( "b" ) ) ] ,
4496
4568
] ) ;
4497
4569
assert_eq ! ( "CUBE (a, b)" , format!( "{cube}" ) ) ;
4498
4570
4499
4571
let cube = Expr :: Cube ( vec ! [
4500
- vec![ Expr :: Identifier ( Ident :: new( "a" ) ) ] ,
4501
- vec![
4502
- Expr :: Identifier ( Ident :: new( "b" ) ) ,
4503
- Expr :: Identifier ( Ident :: new( "c" ) ) ,
4504
- ] ,
4505
- vec![ Expr :: Identifier ( Ident :: new( "d" ) ) ] ,
4572
+ vec![ Expr :: Identifier ( ident( "a" ) ) ] ,
4573
+ vec![ Expr :: Identifier ( ident( "b" ) ) , Expr :: Identifier ( ident( "c" ) ) ] ,
4574
+ vec![ Expr :: Identifier ( ident( "d" ) ) ] ,
4506
4575
] ) ;
4507
4576
assert_eq ! ( "CUBE (a, (b, c), d)" , format!( "{cube}" ) ) ;
4508
4577
}
0 commit comments