@@ -2,6 +2,7 @@ use pg_lexer::{SyntaxKind, Token, TokenType};
22
33use super :: {
44 data:: at_statement_start,
5+ ddl:: create,
56 dml:: { cte, delete, insert, select, update} ,
67 Parser ,
78} ;
@@ -48,6 +49,9 @@ pub(crate) fn statement(p: &mut Parser) {
4849 SyntaxKind :: DeleteP => {
4950 delete ( p) ;
5051 }
52+ SyntaxKind :: Create => {
53+ create ( p) ;
54+ }
5155 _ => {
5256 unknown ( p) ;
5357 }
@@ -71,6 +75,22 @@ pub(crate) fn parenthesis(p: &mut Parser) {
7175 }
7276}
7377
78+ pub ( crate ) fn case ( p : & mut Parser ) {
79+ p. expect ( SyntaxKind :: Case ) ;
80+
81+ loop {
82+ match p. peek ( ) . kind {
83+ SyntaxKind :: EndP => {
84+ p. advance ( ) ;
85+ break ;
86+ }
87+ _ => {
88+ p. advance ( ) ;
89+ }
90+ }
91+ }
92+ }
93+
7494pub ( crate ) fn unknown ( p : & mut Parser ) {
7595 loop {
7696 match p. peek ( ) {
@@ -87,19 +107,52 @@ pub(crate) fn unknown(p: &mut Parser) {
87107 } => {
88108 break ;
89109 }
110+ Token {
111+ kind : SyntaxKind :: Case ,
112+ ..
113+ } => {
114+ case ( p) ;
115+ }
90116 Token {
91117 kind : SyntaxKind :: Ascii40 ,
92118 ..
93119 } => {
94120 parenthesis ( p) ;
95121 }
96- t => {
97- if at_statement_start ( t. kind ) {
122+ t => match at_statement_start ( t. kind ) {
123+ Some ( SyntaxKind :: Select ) => {
124+ // we need to check for `as` here to not break on `select as`
125+ if p. look_back ( ) . map ( |t| t. kind ) != Some ( SyntaxKind :: As ) {
126+ break ;
127+ }
128+ p. advance ( ) ;
129+ }
130+ Some ( SyntaxKind :: Insert ) | Some ( SyntaxKind :: Update ) | Some ( SyntaxKind :: DeleteP ) => {
131+ let prev = p. look_back ( ) . map ( |t| t. kind ) ;
132+ if [
133+ // for create trigger
134+ SyntaxKind :: After ,
135+ // for create rule
136+ SyntaxKind :: On ,
137+ // for create rule
138+ SyntaxKind :: Also ,
139+ // for create rule
140+ SyntaxKind :: Instead ,
141+ ]
142+ . iter ( )
143+ . all ( |x| Some ( x) != prev. as_ref ( ) )
144+ {
145+ break ;
146+ }
147+ p. advance ( ) ;
148+ }
149+ Some ( _) => {
98150 break ;
99151 }
100-
101- p. advance ( ) ;
102- }
152+ None => {
153+ p. advance ( ) ;
154+ }
155+ } ,
103156 }
104157 }
105158}
0 commit comments