@@ -96,7 +96,9 @@ mod built_ins {
96
96
#[ rustfmt:: skip]
97
97
patterns : vec ! [
98
98
// e.g., extract(day from x) => extract("day":true, "from": x)
99
- vec![ Id ( re) , Syn ( Token :: True ) , Kw ( Token :: From ) , AnyOne ( true ) , AnyStar ( false ) ]
99
+ // Note the `true` passed to Any* as we need to support type-related keywords after `FROM`
100
+ // such as `TIME WITH TIME ZONE`
101
+ vec![ Id ( re) , Syn ( Token :: True ) , Kw ( Token :: From ) , AnyOne ( true ) , AnyStar ( true ) ]
100
102
] ,
101
103
}
102
104
}
@@ -907,6 +909,60 @@ mod tests {
907
909
preprocess( r#"extract(second from a)"# ) ?,
908
910
lex( r#"extract(second:True, "from" : a)"# ) ?
909
911
) ;
912
+ assert_eq ! (
913
+ preprocess( r#"extract(hour from TIME WITH TIME ZONE '01:23:45.678-06:30')"# ) ?,
914
+ lex( r#"extract(hour:True, "from" : TIME WITH TIME ZONE '01:23:45.678-06:30')"# ) ?
915
+ ) ;
916
+ assert_eq ! (
917
+ preprocess( r#"extract(minute from TIME WITH TIME ZONE '01:23:45.678-06:30')"# ) ?,
918
+ lex( r#"extract(minute:True, "from" : TIME WITH TIME ZONE '01:23:45.678-06:30')"# ) ?
919
+ ) ;
920
+ assert_eq ! (
921
+ preprocess( r#"extract(second from TIME WITH TIME ZONE '01:23:45.678-06:30')"# ) ?,
922
+ lex( r#"extract(second:True, "from" : TIME WITH TIME ZONE '01:23:45.678-06:30')"# ) ?
923
+ ) ;
924
+ assert_eq ! (
925
+ preprocess( r#"extract(timezone_hour from TIME WITH TIME ZONE '01:23:45.678-06:30')"# ) ?,
926
+ lex(
927
+ r#"extract(timezone_hour:True, "from" : TIME WITH TIME ZONE '01:23:45.678-06:30')"#
928
+ ) ?
929
+ ) ;
930
+ assert_eq ! (
931
+ preprocess(
932
+ r#"extract(timezone_minute from TIME WITH TIME ZONE '01:23:45.678-06:30')"#
933
+ ) ?,
934
+ lex(
935
+ r#"extract(timezone_minute:True, "from" : TIME WITH TIME ZONE '01:23:45.678-06:30')"#
936
+ ) ?
937
+ ) ;
938
+ assert_eq ! (
939
+ preprocess( r#"extract(hour from TIME (2) WITH TIME ZONE '01:23:45.678-06:30')"# ) ?,
940
+ lex( r#"extract(hour:True, "from" : TIME (2) WITH TIME ZONE '01:23:45.678-06:30')"# ) ?
941
+ ) ;
942
+ assert_eq ! (
943
+ preprocess( r#"extract(minute from TIME (2) WITH TIME ZONE '01:23:45.678-06:30')"# ) ?,
944
+ lex( r#"extract(minute:True, "from" : TIME (2) WITH TIME ZONE '01:23:45.678-06:30')"# ) ?
945
+ ) ;
946
+ assert_eq ! (
947
+ preprocess( r#"extract(second from TIME (2) WITH TIME ZONE '01:23:45.678-06:30')"# ) ?,
948
+ lex( r#"extract(second:True, "from" : TIME (2) WITH TIME ZONE '01:23:45.678-06:30')"# ) ?
949
+ ) ;
950
+ assert_eq ! (
951
+ preprocess(
952
+ r#"extract(timezone_hour from TIME (2) WITH TIME ZONE '01:23:45.678-06:30')"#
953
+ ) ?,
954
+ lex(
955
+ r#"extract(timezone_hour:True, "from" : TIME (2) WITH TIME ZONE '01:23:45.678-06:30')"#
956
+ ) ?
957
+ ) ;
958
+ assert_eq ! (
959
+ preprocess(
960
+ r#"extract(timezone_minute from TIME (2) WITH TIME ZONE '01:23:45.678-06:30')"#
961
+ ) ?,
962
+ lex(
963
+ r#"extract(timezone_minute:True, "from" : TIME (2) WITH TIME ZONE '01:23:45.678-06:30')"#
964
+ ) ?
965
+ ) ;
910
966
911
967
assert_eq ! ( preprocess( r#"count(a)"# ) ?, lex( r#"count(a)"# ) ?) ;
912
968
assert_eq ! (
0 commit comments