@@ -10,10 +10,7 @@ use super::{
1010 define:: function:: visit_definition_function,
1111 expression:: { visit_expression, visit_expression_function} ,
1212 literal:: { visit_integer_literal, visit_quoted_string_literal} ,
13- statement:: {
14- thing:: { visit_relation, visit_statement_thing} ,
15- visit_statement,
16- } ,
13+ statement:: { thing:: visit_relation, visit_statement} ,
1714 type_:: { visit_label, visit_label_list} ,
1815 visit_reduce_assignment_var, visit_var, visit_var_named, visit_vars, IntoChildNodes , Node , Rule , RuleMatcher ,
1916} ;
@@ -23,7 +20,7 @@ use crate::{
2320 token:: { Order , ReduceOperator } ,
2421 Spanned ,
2522 } ,
26- parser:: { define:: function:: visit_function_block, statement :: single :: visit_statement_assignment } ,
23+ parser:: define:: function:: visit_function_block,
2724 pattern:: { Conjunction , Disjunction , Negation , Optional , Pattern } ,
2825 query:: {
2926 pipeline:: {
@@ -44,7 +41,6 @@ use crate::{
4441 } ,
4542 Pipeline ,
4643 } ,
47- statement:: Statement ,
4844 value:: StringLiteral ,
4945 TypeRef , TypeRefAny ,
5046} ;
@@ -171,39 +167,45 @@ fn visit_pattern_try(node: Node<'_>) -> Optional {
171167fn visit_clause_insert ( node : Node < ' _ > ) -> Insert {
172168 debug_assert_eq ! ( node. as_rule( ) , Rule :: clause_insert) ;
173169 let span = node. span ( ) ;
174- let statements = node
175- . into_children ( )
176- . skip_expected ( Rule :: INSERT )
177- . map ( |child| match child. as_rule ( ) {
178- Rule :: statement_thing => visit_statement_thing ( child) ,
179- Rule :: statement_assignment => Statement :: Assignment ( visit_statement_assignment ( child) ) ,
180- _ => unreachable ! (
181- "Unrecognised statement inside insert clause: {:?}" ,
182- TypeQLError :: IllegalGrammar { input: child. as_str( ) . to_owned( ) }
183- ) ,
184- } )
185- . collect ( ) ;
186- Insert :: new ( span, statements)
170+ let mut children = node. into_children ( ) ;
171+ let patterns = visit_patterns ( children. skip_expected ( Rule :: INSERT ) . consume_expected ( Rule :: patterns) ) ;
172+ debug_assert_eq ! ( children. try_consume_any( ) , None ) ;
173+ Insert :: new ( span, patterns)
187174}
188175
189176fn visit_clause_put ( node : Node < ' _ > ) -> Put {
190177 debug_assert_eq ! ( node. as_rule( ) , Rule :: clause_put) ;
191178 let span = node. span ( ) ;
192- let statement_things = node. into_children ( ) . skip_expected ( Rule :: PUT ) . map ( visit_statement_thing) . collect ( ) ;
193- Put :: new ( span, statement_things)
179+ let mut children = node. into_children ( ) ;
180+ let patterns = visit_patterns ( children. skip_expected ( Rule :: PUT ) . consume_expected ( Rule :: patterns) ) ;
181+ debug_assert_eq ! ( children. try_consume_any( ) , None ) ;
182+ Put :: new ( span, patterns)
194183}
195184
196185fn visit_clause_update ( node : Node < ' _ > ) -> Update {
197186 debug_assert_eq ! ( node. as_rule( ) , Rule :: clause_update) ;
198187 let span = node. span ( ) ;
199- let statement_things = node. into_children ( ) . skip_expected ( Rule :: UPDATE ) . map ( visit_statement_thing) . collect ( ) ;
200- Update :: new ( span, statement_things)
188+ let mut children = node. into_children ( ) ;
189+ let patterns = visit_patterns ( children. skip_expected ( Rule :: UPDATE ) . consume_expected ( Rule :: patterns) ) ;
190+ debug_assert_eq ! ( children. try_consume_any( ) , None ) ;
191+ Update :: new ( span, patterns)
201192}
202193
203194fn visit_clause_delete ( node : Node < ' _ > ) -> Delete {
204195 debug_assert_eq ! ( node. as_rule( ) , Rule :: clause_delete) ;
205196 let span = node. span ( ) ;
206- let deletables = node. into_children ( ) . skip_expected ( Rule :: DELETE ) . map ( visit_statement_deletable) . collect ( ) ;
197+ let deletables = node
198+ . into_children ( )
199+ . skip_expected ( Rule :: DELETE )
200+ . map ( |child| match child. as_rule ( ) {
201+ Rule :: statement_deletable => visit_statement_deletable ( child) ,
202+ Rule :: pattern_try_deletable => visit_pattern_try_deletable ( child) ,
203+ _ => unreachable ! (
204+ "Unrecognised statement inside delete clause: {:?}" ,
205+ TypeQLError :: IllegalGrammar { input: child. as_str( ) . to_owned( ) }
206+ ) ,
207+ } )
208+ . collect ( ) ;
207209 Delete :: new ( span, deletables)
208210}
209211
@@ -235,6 +237,23 @@ fn visit_statement_deletable(node: Node<'_>) -> Deletable {
235237 Deletable :: new ( span, kind)
236238}
237239
240+ fn visit_pattern_try_deletable ( node : Node < ' _ > ) -> Deletable {
241+ debug_assert_eq ! ( node. as_rule( ) , Rule :: pattern_try_deletable) ;
242+ let span = node. span ( ) ;
243+ let deletables = node
244+ . into_children ( )
245+ . skip_expected ( Rule :: TRY )
246+ . map ( |child| match child. as_rule ( ) {
247+ Rule :: statement_deletable => visit_statement_deletable ( child) ,
248+ _ => unreachable ! (
249+ "Unrecognised statement inside delete clause: {:?}" ,
250+ TypeQLError :: IllegalGrammar { input: child. as_str( ) . to_owned( ) }
251+ ) ,
252+ } )
253+ . collect ( ) ;
254+ Deletable :: new ( span, DeletableKind :: Optional { deletables } )
255+ }
256+
238257fn visit_clause_fetch ( node : Node < ' _ > ) -> Fetch {
239258 debug_assert_eq ! ( node. as_rule( ) , Rule :: clause_fetch) ;
240259 let span = node. span ( ) ;
0 commit comments