File tree Expand file tree Collapse file tree 4 files changed +73
-0
lines changed Expand file tree Collapse file tree 4 files changed +73
-0
lines changed Original file line number Diff line number Diff line change @@ -1537,6 +1537,20 @@ pub enum Statement {
1537
1537
/// Only for mysql
1538
1538
priority : Option < MysqlInsertPriority > ,
1539
1539
} ,
1540
+ /// ```sql
1541
+ /// INSTALL
1542
+ /// ```
1543
+ Install {
1544
+ /// Only for DuckDB
1545
+ extension_name : Ident ,
1546
+ } ,
1547
+ /// ```sql
1548
+ /// LOAD
1549
+ /// ```
1550
+ Load {
1551
+ /// Only for DuckDB
1552
+ extension_name : Ident ,
1553
+ } ,
1540
1554
// TODO: Support ROW FORMAT
1541
1555
Directory {
1542
1556
overwrite : bool ,
@@ -2637,6 +2651,13 @@ impl fmt::Display for Statement {
2637
2651
2638
2652
Ok ( ( ) )
2639
2653
}
2654
+ Statement :: Install {
2655
+ extension_name : name,
2656
+ } => write ! ( f, "INSTALL {name}" ) ,
2657
+
2658
+ Statement :: Load {
2659
+ extension_name : name,
2660
+ } => write ! ( f, "LOAD {name}" ) ,
2640
2661
2641
2662
Statement :: Call ( function) => write ! ( f, "CALL {function}" ) ,
2642
2663
Original file line number Diff line number Diff line change @@ -351,6 +351,7 @@ define_keywords!(
351
351
INPUTFORMAT ,
352
352
INSENSITIVE ,
353
353
INSERT ,
354
+ INSTALL ,
354
355
INT ,
355
356
INT2 ,
356
357
INT4 ,
@@ -390,6 +391,7 @@ define_keywords!(
390
391
LIMIT ,
391
392
LISTAGG ,
392
393
LN ,
394
+ LOAD ,
393
395
LOCAL ,
394
396
LOCALTIME ,
395
397
LOCALTIMESTAMP ,
Original file line number Diff line number Diff line change @@ -516,6 +516,15 @@ impl<'a> Parser<'a> {
516
516
Keyword :: MERGE => Ok ( self . parse_merge ( ) ?) ,
517
517
// `PRAGMA` is sqlite specific https://www.sqlite.org/pragma.html
518
518
Keyword :: PRAGMA => Ok ( self . parse_pragma ( ) ?) ,
519
+ // `INSTALL` is duckdb specific https://duckdb.org/docs/extensions/overview
520
+ Keyword :: INSTALL if dialect_of ! ( self is DuckDbDialect | GenericDialect ) => {
521
+ Ok ( self . parse_install ( ) ?)
522
+ }
523
+ // `LOAD` is duckdb specific https://duckdb.org/docs/extensions/overview
524
+ Keyword :: LOAD if dialect_of ! ( self is DuckDbDialect | GenericDialect ) => {
525
+ Ok ( self . parse_load ( ) ?)
526
+ }
527
+
519
528
_ => self . expected ( "an SQL statement" , next_token) ,
520
529
} ,
521
530
Token :: LParen => {
@@ -8791,6 +8800,19 @@ impl<'a> Parser<'a> {
8791
8800
}
8792
8801
}
8793
8802
8803
+ /// `INSTALL [extension_name]`
8804
+ pub fn parse_install ( & mut self ) -> Result < Statement , ParserError > {
8805
+ let extension_name = self . parse_identifier ( false ) ?;
8806
+
8807
+ Ok ( Statement :: Install { extension_name } )
8808
+ }
8809
+
8810
+ /// `LOAD [extension_name]`
8811
+ pub fn parse_load ( & mut self ) -> Result < Statement , ParserError > {
8812
+ let extension_name = self . parse_identifier ( false ) ?;
8813
+ Ok ( Statement :: Load { extension_name } )
8814
+ }
8815
+
8794
8816
/// ```sql
8795
8817
/// CREATE [ { TEMPORARY | TEMP } ] SEQUENCE [ IF NOT EXISTS ] <sequence_name>
8796
8818
/// ```
Original file line number Diff line number Diff line change @@ -216,3 +216,31 @@ fn test_select_union_by_name() {
216
216
assert_eq ! ( ast. body, expected) ;
217
217
}
218
218
}
219
+
220
+ #[ test]
221
+ fn test_duckdb_install ( ) {
222
+ let stmt = duckdb ( ) . verified_stmt ( "INSTALL tpch" ) ;
223
+ assert_eq ! (
224
+ stmt,
225
+ Statement :: Install {
226
+ extension_name: Ident {
227
+ value: "tpch" . to_string( ) ,
228
+ quote_style: None
229
+ }
230
+ }
231
+ ) ;
232
+ }
233
+
234
+ #[ test]
235
+ fn test_duckdb_load_extension ( ) {
236
+ let stmt = duckdb ( ) . verified_stmt ( "LOAD my_extension" ) ;
237
+ assert_eq ! (
238
+ Statement :: Load {
239
+ extension_name: Ident {
240
+ value: "my_extension" . to_string( ) ,
241
+ quote_style: None
242
+ }
243
+ } ,
244
+ stmt
245
+ ) ;
246
+ }
You can’t perform that action at this time.
0 commit comments