Skip to content

Commit a83c9db

Browse files
committed
Add support for Postgres LOAD extension expr
1 parent 0998398 commit a83c9db

File tree

3 files changed

+55
-14
lines changed

3 files changed

+55
-14
lines changed

src/dialect/postgresql.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,11 @@ impl Dialect for PostgreSqlDialect {
214214
fn supports_comment_on(&self) -> bool {
215215
true
216216
}
217+
218+
/// See <https://www.postgresql.org/docs/current/sql-load.html>
219+
fn supports_load_extension(&self) -> bool {
220+
true
221+
}
217222
}
218223

219224
pub fn parse_create(parser: &mut Parser) -> Option<Result<Statement, ParserError>> {

tests/sqlparser_common.rs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11895,6 +11895,56 @@ fn parse_load_data() {
1189511895
);
1189611896
}
1189711897

11898+
#[test]
11899+
fn test_load_extension() {
11900+
let dialects = all_dialects_where(|d| d.supports_load_extension());
11901+
let only_supports_load_data_dialects =
11902+
all_dialects_where(|d| !d.supports_load_extension() && d.supports_load_data());
11903+
let not_supports_load_dialects =
11904+
all_dialects_where(|d| !d.supports_load_data() && !d.supports_load_extension());
11905+
let sql = "LOAD my_extension";
11906+
11907+
match dialects.verified_stmt(sql) {
11908+
Statement::Load { extension_name } => {
11909+
assert_eq!(Ident::new("my_extension"), extension_name);
11910+
}
11911+
_ => unreachable!(),
11912+
};
11913+
11914+
assert_eq!(
11915+
only_supports_load_data_dialects
11916+
.parse_sql_statements(sql)
11917+
.unwrap_err(),
11918+
ParserError::ParserError(
11919+
"Expected: `DATA` or an extension name after `LOAD`, found: my_extension".to_string()
11920+
)
11921+
);
11922+
11923+
assert_eq!(
11924+
not_supports_load_dialects
11925+
.parse_sql_statements(sql)
11926+
.unwrap_err(),
11927+
ParserError::ParserError(
11928+
"Expected: `DATA` or an extension name after `LOAD`, found: my_extension".to_string()
11929+
)
11930+
);
11931+
11932+
let sql = "LOAD 'filename'";
11933+
11934+
match dialects.verified_stmt(sql) {
11935+
Statement::Load { extension_name } => {
11936+
assert_eq!(
11937+
Ident {
11938+
value: "filename".to_string(),
11939+
quote_style: Some('\'')
11940+
},
11941+
extension_name
11942+
);
11943+
}
11944+
_ => unreachable!(),
11945+
};
11946+
}
11947+
1189811948
#[test]
1189911949
fn test_select_top() {
1190011950
let dialects = all_dialects_where(|d| d.supports_top_before_distinct());

tests/sqlparser_duckdb.rs

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -359,20 +359,6 @@ fn test_duckdb_install() {
359359
);
360360
}
361361

362-
#[test]
363-
fn test_duckdb_load_extension() {
364-
let stmt = duckdb().verified_stmt("LOAD my_extension");
365-
assert_eq!(
366-
Statement::Load {
367-
extension_name: Ident {
368-
value: "my_extension".to_string(),
369-
quote_style: None
370-
}
371-
},
372-
stmt
373-
);
374-
}
375-
376362
#[test]
377363
fn test_duckdb_struct_literal() {
378364
//struct literal syntax https://duckdb.org/docs/sql/data_types/struct#creating-structs

0 commit comments

Comments
 (0)