@@ -37,7 +37,7 @@ use crate::ast::{
3737 StorageSerializationPolicy , TableObject , TagsColumnOption , Value , WrappedCollection ,
3838} ;
3939use crate :: dialect:: { Dialect , Precedence } ;
40- use crate :: keywords:: Keyword ;
40+ use crate :: keywords:: { Keyword , RESERVED_FOR_COLUMN_ALIAS } ;
4141use crate :: parser:: { IsOptional , Parser , ParserError } ;
4242use crate :: tokenizer:: Token ;
4343use crate :: tokenizer:: TokenWithSpan ;
@@ -1460,7 +1460,7 @@ fn parse_select_item_for_data_load(
14601460) -> Result < StageLoadSelectItem , ParserError > {
14611461 let mut alias: Option < Ident > = None ;
14621462 let mut file_col_num: i32 = 0 ;
1463- let mut element: Option < Ident > = None ;
1463+ let mut element: Option < Vec < Ident > > = None ;
14641464 let mut item_as: Option < Ident > = None ;
14651465
14661466 let next_token = parser. next_token ( ) ;
@@ -1493,27 +1493,30 @@ fn parse_select_item_for_data_load(
14931493 } ?;
14941494 }
14951495
1496- // try extracting optional element
1497- match parser. next_token ( ) . token {
1498- Token :: Colon => {
1499- // parse element
1500- element = Some ( Ident :: new ( match parser. next_token ( ) . token {
1501- Token :: Word ( w) => Ok ( w. value ) ,
1502- _ => parser. expected ( "file_col_num" , parser. peek_token ( ) ) ,
1503- } ?) ) ;
1504- }
1505- _ => {
1506- // element not present move back
1507- parser. prev_token ( ) ;
1496+ // try extracting optional element path (e.g. :UsageMetrics:hh)
1497+ let mut elements = Vec :: new ( ) ;
1498+ while parser. next_token ( ) . token == Token :: Colon {
1499+ match parser. next_token ( ) . token {
1500+ Token :: Word ( w) => elements. push ( Ident :: new ( w. value ) ) ,
1501+ _ => return parser. expected ( "element name" , parser. peek_token ( ) ) ,
15081502 }
15091503 }
1504+ parser. prev_token ( ) ;
1505+ if !elements. is_empty ( ) {
1506+ element = Some ( elements) ;
1507+ }
15101508
1511- // as
1509+ // optional alias: `AS alias` or just `alias` (implicit)
15121510 if parser. parse_keyword ( Keyword :: AS ) {
15131511 item_as = Some ( match parser. next_token ( ) . token {
15141512 Token :: Word ( w) => Ok ( Ident :: new ( w. value ) ) ,
15151513 _ => parser. expected ( "column item alias" , parser. peek_token ( ) ) ,
15161514 } ?) ;
1515+ } else if let Token :: Word ( w) = parser. peek_token ( ) . token {
1516+ if !RESERVED_FOR_COLUMN_ALIAS . contains ( & w. keyword ) {
1517+ parser. next_token ( ) ;
1518+ item_as = Some ( Ident :: new ( w. value ) ) ;
1519+ }
15171520 }
15181521
15191522 Ok ( StageLoadSelectItem {
0 commit comments