@@ -69,23 +69,24 @@ impl fmt::Display for ParserError {
69
69
impl Error for ParserError { }
70
70
71
71
/// SQL Parser
72
- pub struct Parser {
72
+ pub struct Parser < ' a > {
73
73
tokens : Vec < Token > ,
74
74
/// The index of the first unprocessed token in `self.tokens`
75
75
index : usize ,
76
+ dialect : & ' a dyn Dialect ,
76
77
}
77
78
78
- impl Parser {
79
+ impl < ' a > Parser < ' a > {
79
80
/// Parse the specified tokens
80
- pub fn new ( tokens : Vec < Token > ) -> Self {
81
- Parser { tokens, index : 0 }
81
+ pub fn new ( tokens : Vec < Token > , dialect : & ' a dyn Dialect ) -> Self {
82
+ Parser { tokens, index : 0 , dialect }
82
83
}
83
84
84
85
/// Parse a SQL statement and produce an Abstract Syntax Tree (AST)
85
86
pub fn parse_sql ( dialect : & dyn Dialect , sql : String ) -> Result < Vec < Statement > , ParserError > {
86
87
let mut tokenizer = Tokenizer :: new ( dialect, & sql) ;
87
88
let tokens = tokenizer. tokenize ( ) ?;
88
- let mut parser = Parser :: new ( tokens) ;
89
+ let mut parser = Parser :: new ( tokens, dialect ) ;
89
90
let mut stmts = Vec :: new ( ) ;
90
91
let mut expecting_statement_delimiter = false ;
91
92
debug ! ( "Parsing sql '{}'..." , sql) ;
@@ -839,7 +840,7 @@ impl Parser {
839
840
/// Parse a comma-separated list of 1+ items accepted by `F`
840
841
pub fn parse_comma_separated < T , F > ( & mut self , mut f : F ) -> Result < Vec < T > , ParserError >
841
842
where
842
- F : FnMut ( & mut Parser ) -> Result < T , ParserError > ,
843
+ F : FnMut ( & mut Parser < ' a > ) -> Result < T , ParserError > ,
843
844
{
844
845
let mut values = vec ! [ ] ;
845
846
loop {
@@ -1019,8 +1020,12 @@ impl Parser {
1019
1020
ColumnOption :: Unique { is_primary : false }
1020
1021
} else if self . parse_keyword ( "REFERENCES" ) {
1021
1022
let foreign_table = self . parse_object_name ( ) ?;
1022
- let referred_columns =
1023
- self . parse_parenthesized_column_list ( Optional ) ?;
1023
+ let referred_columns = self . parse_parenthesized_column_list (
1024
+ if self . dialect . allow_omit_referenced_columns_in_column_option ( ) {
1025
+ Optional
1026
+ } else {
1027
+ Mandatory
1028
+ } ) ?;
1024
1029
ColumnOption :: ForeignKey {
1025
1030
foreign_table,
1026
1031
referred_columns,
0 commit comments