@@ -17,7 +17,10 @@ use alloc::{
17
17
string:: { String , ToString } ,
18
18
vec:: Vec ,
19
19
} ;
20
+
21
+ use core:: borrow:: Borrow ;
20
22
use core:: fmt:: { self , Display } ;
23
+ use std:: ops:: Deref ;
21
24
22
25
#[ cfg( feature = "serde" ) ]
23
26
use serde:: { Deserialize , Serialize } ;
@@ -50,6 +53,7 @@ pub use self::value::{
50
53
use crate :: ast:: helpers:: stmt_data_loading:: {
51
54
DataLoadingOptions , StageLoadSelectItem , StageParamsObject ,
52
55
} ;
56
+ use crate :: tokenizer:: Span ;
53
57
#[ cfg( feature = "visitor" ) ]
54
58
pub use visitor:: * ;
55
59
@@ -340,6 +344,78 @@ impl fmt::Display for JsonOperator {
340
344
}
341
345
}
342
346
347
+ #[ derive( Debug , Clone , PartialEq , PartialOrd , Eq , Ord , Hash ) ]
348
+ #[ cfg_attr( feature = "serde" , derive( Serialize , Deserialize ) ) ]
349
+ #[ cfg_attr( feature = "visitor" , derive( Visit , VisitMut ) ) ]
350
+ pub struct WithSpan < T >
351
+ where
352
+ T : Clone + Eq + Ord + std:: hash:: Hash + PartialOrd + PartialEq ,
353
+ {
354
+ inner : T ,
355
+ span : Span ,
356
+ }
357
+
358
+ impl < T > WithSpan < T >
359
+ where
360
+ T : Clone + Eq + Ord + std:: hash:: Hash + PartialOrd + PartialEq ,
361
+ {
362
+ pub fn new ( inner : T , span : Span ) -> Self {
363
+ Self { inner, span }
364
+ }
365
+
366
+ pub fn unwrap ( self ) -> T {
367
+ self . inner
368
+ }
369
+ }
370
+
371
+ pub trait SpanWrapped : Clone + Eq + Ord + std:: hash:: Hash + PartialOrd + PartialEq {
372
+ fn spanning < U : Into < Span > > ( self , span : U ) -> WithSpan < Self > {
373
+ WithSpan :: new ( self , span. into ( ) )
374
+ }
375
+
376
+ fn empty_span ( self ) -> WithSpan < Self > {
377
+ self . spanning ( Span :: default ( ) )
378
+ }
379
+ }
380
+
381
+ impl < T > SpanWrapped for T
382
+ where
383
+ T : Clone + Eq + Ord + std:: hash:: Hash + PartialOrd + PartialEq ,
384
+ {
385
+ fn spanning < U : Into < Span > > ( self , span : U ) -> WithSpan < Self > {
386
+ WithSpan :: new ( self , span. into ( ) )
387
+ }
388
+ }
389
+
390
+ impl < T > Deref for WithSpan < T >
391
+ where
392
+ T : Clone + Eq + Ord + std:: hash:: Hash + PartialOrd + PartialEq ,
393
+ {
394
+ type Target = T ;
395
+
396
+ fn deref ( & self ) -> & Self :: Target {
397
+ & self . inner
398
+ }
399
+ }
400
+
401
+ impl < T > Borrow < T > for WithSpan < T >
402
+ where
403
+ T : Clone + Eq + Ord + std:: hash:: Hash + PartialOrd + PartialEq ,
404
+ {
405
+ fn borrow ( & self ) -> & T {
406
+ & self . inner
407
+ }
408
+ }
409
+
410
+ impl < T : fmt:: Display > fmt:: Display for WithSpan < T >
411
+ where
412
+ T : Clone + Eq + Ord + std:: hash:: Hash + PartialOrd + PartialEq ,
413
+ {
414
+ fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
415
+ write ! ( f, "{}" , self . inner)
416
+ }
417
+ }
418
+
343
419
/// An SQL expression of any type.
344
420
///
345
421
/// The parser does not distinguish between expressions of different types
@@ -354,7 +430,7 @@ impl fmt::Display for JsonOperator {
354
430
) ]
355
431
pub enum Expr {
356
432
/// Identifier e.g. table name or column name
357
- Identifier ( Ident ) ,
433
+ Identifier ( WithSpan < Ident > ) ,
358
434
/// Multi-part identifier, e.g. `table_alias.column` or `schema.table.col`
359
435
CompoundIdentifier ( Vec < Ident > ) ,
360
436
/// JSON access (postgres) eg: data->'tags'
@@ -1025,7 +1101,7 @@ impl fmt::Display for Expr {
1025
1101
#[ cfg_attr( feature = "visitor" , derive( Visit , VisitMut ) ) ]
1026
1102
pub enum WindowType {
1027
1103
WindowSpec ( WindowSpec ) ,
1028
- NamedWindow ( Ident ) ,
1104
+ NamedWindow ( WithSpan < Ident > ) ,
1029
1105
}
1030
1106
1031
1107
impl Display for WindowType {
@@ -4732,6 +4808,10 @@ impl fmt::Display for SearchModifier {
4732
4808
mod tests {
4733
4809
use super :: * ;
4734
4810
4811
+ fn ident < T : Into < String > > ( value : T ) -> WithSpan < Ident > {
4812
+ SpanWrapped :: empty_span ( Ident :: new ( value) )
4813
+ }
4814
+
4735
4815
#[ test]
4736
4816
fn test_window_frame_default ( ) {
4737
4817
let window_frame = WindowFrame :: default ( ) ;
@@ -4742,84 +4822,72 @@ mod tests {
4742
4822
fn test_grouping_sets_display ( ) {
4743
4823
// a and b in different group
4744
4824
let grouping_sets = Expr :: GroupingSets ( vec ! [
4745
- vec![ Expr :: Identifier ( Ident :: new ( "a" ) ) ] ,
4746
- vec![ Expr :: Identifier ( Ident :: new ( "b" ) ) ] ,
4825
+ vec![ Expr :: Identifier ( ident ( "a" ) ) ] ,
4826
+ vec![ Expr :: Identifier ( ident ( "b" ) ) ] ,
4747
4827
] ) ;
4748
4828
assert_eq ! ( "GROUPING SETS ((a), (b))" , format!( "{grouping_sets}" ) ) ;
4749
4829
4750
4830
// a and b in the same group
4751
4831
let grouping_sets = Expr :: GroupingSets ( vec ! [ vec![
4752
- Expr :: Identifier ( Ident :: new ( "a" ) ) ,
4753
- Expr :: Identifier ( Ident :: new ( "b" ) ) ,
4832
+ Expr :: Identifier ( ident ( "a" ) ) ,
4833
+ Expr :: Identifier ( ident ( "b" ) ) ,
4754
4834
] ] ) ;
4755
4835
assert_eq ! ( "GROUPING SETS ((a, b))" , format!( "{grouping_sets}" ) ) ;
4756
4836
4757
4837
// (a, b) and (c, d) in different group
4758
4838
let grouping_sets = Expr :: GroupingSets ( vec ! [
4759
- vec![
4760
- Expr :: Identifier ( Ident :: new( "a" ) ) ,
4761
- Expr :: Identifier ( Ident :: new( "b" ) ) ,
4762
- ] ,
4763
- vec![
4764
- Expr :: Identifier ( Ident :: new( "c" ) ) ,
4765
- Expr :: Identifier ( Ident :: new( "d" ) ) ,
4766
- ] ,
4839
+ vec![ Expr :: Identifier ( ident( "a" ) ) , Expr :: Identifier ( ident( "b" ) ) ] ,
4840
+ vec![ Expr :: Identifier ( ident( "c" ) ) , Expr :: Identifier ( ident( "d" ) ) ] ,
4767
4841
] ) ;
4768
4842
assert_eq ! ( "GROUPING SETS ((a, b), (c, d))" , format!( "{grouping_sets}" ) ) ;
4769
4843
}
4770
4844
4771
4845
#[ test]
4772
4846
fn test_rollup_display ( ) {
4773
- let rollup = Expr :: Rollup ( vec ! [ vec![ Expr :: Identifier ( Ident :: new ( "a" ) ) ] ] ) ;
4847
+ let rollup = Expr :: Rollup ( vec ! [ vec![ Expr :: Identifier ( ident ( "a" ) ) ] ] ) ;
4774
4848
assert_eq ! ( "ROLLUP (a)" , format!( "{rollup}" ) ) ;
4775
4849
4776
4850
let rollup = Expr :: Rollup ( vec ! [ vec![
4777
- Expr :: Identifier ( Ident :: new ( "a" ) ) ,
4778
- Expr :: Identifier ( Ident :: new ( "b" ) ) ,
4851
+ Expr :: Identifier ( ident ( "a" ) ) ,
4852
+ Expr :: Identifier ( ident ( "b" ) ) ,
4779
4853
] ] ) ;
4780
4854
assert_eq ! ( "ROLLUP ((a, b))" , format!( "{rollup}" ) ) ;
4781
4855
4782
4856
let rollup = Expr :: Rollup ( vec ! [
4783
- vec![ Expr :: Identifier ( Ident :: new ( "a" ) ) ] ,
4784
- vec![ Expr :: Identifier ( Ident :: new ( "b" ) ) ] ,
4857
+ vec![ Expr :: Identifier ( ident ( "a" ) ) ] ,
4858
+ vec![ Expr :: Identifier ( ident ( "b" ) ) ] ,
4785
4859
] ) ;
4786
4860
assert_eq ! ( "ROLLUP (a, b)" , format!( "{rollup}" ) ) ;
4787
4861
4788
4862
let rollup = Expr :: Rollup ( vec ! [
4789
- vec![ Expr :: Identifier ( Ident :: new( "a" ) ) ] ,
4790
- vec![
4791
- Expr :: Identifier ( Ident :: new( "b" ) ) ,
4792
- Expr :: Identifier ( Ident :: new( "c" ) ) ,
4793
- ] ,
4794
- vec![ Expr :: Identifier ( Ident :: new( "d" ) ) ] ,
4863
+ vec![ Expr :: Identifier ( ident( "a" ) ) ] ,
4864
+ vec![ Expr :: Identifier ( ident( "b" ) ) , Expr :: Identifier ( ident( "c" ) ) ] ,
4865
+ vec![ Expr :: Identifier ( ident( "d" ) ) ] ,
4795
4866
] ) ;
4796
4867
assert_eq ! ( "ROLLUP (a, (b, c), d)" , format!( "{rollup}" ) ) ;
4797
4868
}
4798
4869
4799
4870
#[ test]
4800
4871
fn test_cube_display ( ) {
4801
- let cube = Expr :: Cube ( vec ! [ vec![ Expr :: Identifier ( Ident :: new ( "a" ) ) ] ] ) ;
4872
+ let cube = Expr :: Cube ( vec ! [ vec![ Expr :: Identifier ( ident ( "a" ) ) ] ] ) ;
4802
4873
assert_eq ! ( "CUBE (a)" , format!( "{cube}" ) ) ;
4803
4874
4804
4875
let cube = Expr :: Cube ( vec ! [ vec![
4805
- Expr :: Identifier ( Ident :: new ( "a" ) ) ,
4806
- Expr :: Identifier ( Ident :: new ( "b" ) ) ,
4876
+ Expr :: Identifier ( ident ( "a" ) ) ,
4877
+ Expr :: Identifier ( ident ( "b" ) ) ,
4807
4878
] ] ) ;
4808
4879
assert_eq ! ( "CUBE ((a, b))" , format!( "{cube}" ) ) ;
4809
4880
4810
4881
let cube = Expr :: Cube ( vec ! [
4811
- vec![ Expr :: Identifier ( Ident :: new ( "a" ) ) ] ,
4812
- vec![ Expr :: Identifier ( Ident :: new ( "b" ) ) ] ,
4882
+ vec![ Expr :: Identifier ( ident ( "a" ) ) ] ,
4883
+ vec![ Expr :: Identifier ( ident ( "b" ) ) ] ,
4813
4884
] ) ;
4814
4885
assert_eq ! ( "CUBE (a, b)" , format!( "{cube}" ) ) ;
4815
4886
4816
4887
let cube = Expr :: Cube ( vec ! [
4817
- vec![ Expr :: Identifier ( Ident :: new( "a" ) ) ] ,
4818
- vec![
4819
- Expr :: Identifier ( Ident :: new( "b" ) ) ,
4820
- Expr :: Identifier ( Ident :: new( "c" ) ) ,
4821
- ] ,
4822
- vec![ Expr :: Identifier ( Ident :: new( "d" ) ) ] ,
4888
+ vec![ Expr :: Identifier ( ident( "a" ) ) ] ,
4889
+ vec![ Expr :: Identifier ( ident( "b" ) ) , Expr :: Identifier ( ident( "c" ) ) ] ,
4890
+ vec![ Expr :: Identifier ( ident( "d" ) ) ] ,
4823
4891
] ) ;
4824
4892
assert_eq ! ( "CUBE (a, (b, c), d)" , format!( "{cube}" ) ) ;
4825
4893
}
0 commit comments