@@ -1191,29 +1191,6 @@ impl<'a> Parser<'a> {
1191
1191
} )
1192
1192
}
1193
1193
1194
- fn parse_column_def ( & mut self ) -> Result < ColumnDef , ParserError > {
1195
- let name = self . parse_identifier ( ) ?;
1196
- let data_type = self . parse_data_type ( ) ?;
1197
- let collation = if self . parse_keyword ( Keyword :: COLLATE ) {
1198
- Some ( self . parse_object_name ( ) ?)
1199
- } else {
1200
- None
1201
- } ;
1202
- let mut options = vec ! [ ] ;
1203
- loop {
1204
- match self . peek_token ( ) {
1205
- Token :: EOF | Token :: Comma | Token :: RParen | Token :: SemiColon => break ,
1206
- _ => options. push ( self . parse_column_option_def ( ) ?) ,
1207
- }
1208
- }
1209
- Ok ( ColumnDef {
1210
- name,
1211
- data_type,
1212
- collation,
1213
- options,
1214
- } )
1215
- }
1216
-
1217
1194
fn parse_columns ( & mut self ) -> Result < ( Vec < ColumnDef > , Vec < TableConstraint > ) , ParserError > {
1218
1195
let mut columns = vec ! [ ] ;
1219
1196
let mut constraints = vec ! [ ] ;
@@ -1225,8 +1202,7 @@ impl<'a> Parser<'a> {
1225
1202
if let Some ( constraint) = self . parse_optional_table_constraint ( ) ? {
1226
1203
constraints. push ( constraint) ;
1227
1204
} else if let Token :: Word ( _) = self . peek_token ( ) {
1228
- let column_def = self . parse_column_def ( ) ?;
1229
- columns. push ( column_def) ;
1205
+ columns. push ( self . parse_column_def ( ) ?) ;
1230
1206
} else {
1231
1207
return self . expected ( "column name or constraint definition" , self . peek_token ( ) ) ;
1232
1208
}
@@ -1242,23 +1218,51 @@ impl<'a> Parser<'a> {
1242
1218
Ok ( ( columns, constraints) )
1243
1219
}
1244
1220
1245
- pub fn parse_column_option_def ( & mut self ) -> Result < ColumnOptionDef , ParserError > {
1246
- let name = if self . parse_keyword ( Keyword :: CONSTRAINT ) {
1247
- Some ( self . parse_identifier ( ) ?)
1221
+ fn parse_column_def ( & mut self ) -> Result < ColumnDef , ParserError > {
1222
+ let name = self . parse_identifier ( ) ?;
1223
+ let data_type = self . parse_data_type ( ) ?;
1224
+ let collation = if self . parse_keyword ( Keyword :: COLLATE ) {
1225
+ Some ( self . parse_object_name ( ) ?)
1248
1226
} else {
1249
1227
None
1250
1228
} ;
1229
+ let mut options = vec ! [ ] ;
1230
+ loop {
1231
+ if self . parse_keyword ( Keyword :: CONSTRAINT ) {
1232
+ let name = Some ( self . parse_identifier ( ) ?) ;
1233
+ if let Some ( option) = self . parse_optional_column_option ( ) ? {
1234
+ options. push ( ColumnOptionDef { name, option } ) ;
1235
+ } else {
1236
+ return self . expected (
1237
+ "constraint details after CONSTRAINT <name>" ,
1238
+ self . peek_token ( ) ,
1239
+ ) ;
1240
+ }
1241
+ } else if let Some ( option) = self . parse_optional_column_option ( ) ? {
1242
+ options. push ( ColumnOptionDef { name : None , option } ) ;
1243
+ } else {
1244
+ break ;
1245
+ } ;
1246
+ }
1247
+ Ok ( ColumnDef {
1248
+ name,
1249
+ data_type,
1250
+ collation,
1251
+ options,
1252
+ } )
1253
+ }
1251
1254
1252
- let option = if self . parse_keywords ( & [ Keyword :: NOT , Keyword :: NULL ] ) {
1253
- ColumnOption :: NotNull
1255
+ pub fn parse_optional_column_option ( & mut self ) -> Result < Option < ColumnOption > , ParserError > {
1256
+ if self . parse_keywords ( & [ Keyword :: NOT , Keyword :: NULL ] ) {
1257
+ Ok ( Some ( ColumnOption :: NotNull ) )
1254
1258
} else if self . parse_keyword ( Keyword :: NULL ) {
1255
- ColumnOption :: Null
1259
+ Ok ( Some ( ColumnOption :: Null ) )
1256
1260
} else if self . parse_keyword ( Keyword :: DEFAULT ) {
1257
- ColumnOption :: Default ( self . parse_expr ( ) ?)
1261
+ Ok ( Some ( ColumnOption :: Default ( self . parse_expr ( ) ?) ) )
1258
1262
} else if self . parse_keywords ( & [ Keyword :: PRIMARY , Keyword :: KEY ] ) {
1259
- ColumnOption :: Unique { is_primary : true }
1263
+ Ok ( Some ( ColumnOption :: Unique { is_primary : true } ) )
1260
1264
} else if self . parse_keyword ( Keyword :: UNIQUE ) {
1261
- ColumnOption :: Unique { is_primary : false }
1265
+ Ok ( Some ( ColumnOption :: Unique { is_primary : false } ) )
1262
1266
} else if self . parse_keyword ( Keyword :: REFERENCES ) {
1263
1267
let foreign_table = self . parse_object_name ( ) ?;
1264
1268
// PostgreSQL allows omitting the column list and
@@ -1277,32 +1281,34 @@ impl<'a> Parser<'a> {
1277
1281
break ;
1278
1282
}
1279
1283
}
1280
- ColumnOption :: ForeignKey {
1284
+ Ok ( Some ( ColumnOption :: ForeignKey {
1281
1285
foreign_table,
1282
1286
referred_columns,
1283
1287
on_delete,
1284
1288
on_update,
1285
- }
1289
+ } ) )
1286
1290
} else if self . parse_keyword ( Keyword :: CHECK ) {
1287
1291
self . expect_token ( & Token :: LParen ) ?;
1288
1292
let expr = self . parse_expr ( ) ?;
1289
1293
self . expect_token ( & Token :: RParen ) ?;
1290
- ColumnOption :: Check ( expr)
1294
+ Ok ( Some ( ColumnOption :: Check ( expr) ) )
1291
1295
} else if self . parse_keyword ( Keyword :: AUTO_INCREMENT )
1292
1296
&& dialect_of ! ( self is MySqlDialect | GenericDialect )
1293
1297
{
1294
1298
// Support AUTO_INCREMENT for MySQL
1295
- ColumnOption :: DialectSpecific ( vec ! [ Token :: make_keyword( "AUTO_INCREMENT" ) ] )
1299
+ Ok ( Some ( ColumnOption :: DialectSpecific ( vec ! [
1300
+ Token :: make_keyword( "AUTO_INCREMENT" ) ,
1301
+ ] ) ) )
1296
1302
} else if self . parse_keyword ( Keyword :: AUTOINCREMENT )
1297
1303
&& dialect_of ! ( self is SQLiteDialect | GenericDialect )
1298
1304
{
1299
1305
// Support AUTOINCREMENT for SQLite
1300
- ColumnOption :: DialectSpecific ( vec ! [ Token :: make_keyword( "AUTOINCREMENT" ) ] )
1306
+ Ok ( Some ( ColumnOption :: DialectSpecific ( vec ! [
1307
+ Token :: make_keyword( "AUTOINCREMENT" ) ,
1308
+ ] ) ) )
1301
1309
} else {
1302
- return self . expected ( "column option" , self . peek_token ( ) ) ;
1303
- } ;
1304
-
1305
- Ok ( ColumnOptionDef { name, option } )
1310
+ Ok ( None )
1311
+ }
1306
1312
}
1307
1313
1308
1314
pub fn parse_referential_action ( & mut self ) -> Result < ReferentialAction , ParserError > {
0 commit comments