Skip to content

Commit 1b97004

Browse files
committed
test: add CREATE FOREIGN DATA WRAPPER and CREATE FOREIGN TABLE tests
Round-trip tests via pg().verified_stmt for: - FDW: name-only, HANDLER, NO HANDLER, NO VALIDATOR, combined HANDLER+VALIDATOR+OPTIONS - FOREIGN TABLE: basic columns+SERVER, IF NOT EXISTS, table-level OPTIONS
1 parent 6f28faa commit 1b97004

1 file changed

Lines changed: 96 additions & 0 deletions

File tree

tests/sqlparser_postgres.rs

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9221,3 +9221,99 @@ fn parse_lock_table() {
92219221
}
92229222
}
92239223
}
9224+
9225+
#[test]
9226+
fn parse_create_foreign_data_wrapper() {
9227+
// Minimal: name only.
9228+
let sql = "CREATE FOREIGN DATA WRAPPER myfdw";
9229+
let Statement::CreateForeignDataWrapper(stmt) = pg().verified_stmt(sql) else {
9230+
unreachable!()
9231+
};
9232+
assert_eq!(stmt.name.value, "myfdw");
9233+
assert!(stmt.handler.is_none());
9234+
assert!(stmt.validator.is_none());
9235+
assert!(stmt.options.is_none());
9236+
9237+
// With HANDLER.
9238+
let sql = "CREATE FOREIGN DATA WRAPPER myfdw HANDLER myhandler";
9239+
let Statement::CreateForeignDataWrapper(stmt) = pg().verified_stmt(sql) else {
9240+
unreachable!()
9241+
};
9242+
assert_eq!(
9243+
stmt.handler,
9244+
Some(FdwRoutineClause::Function(ObjectName::from(vec![
9245+
"myhandler".into()
9246+
])))
9247+
);
9248+
9249+
// With NO HANDLER.
9250+
let sql = "CREATE FOREIGN DATA WRAPPER myfdw NO HANDLER";
9251+
let Statement::CreateForeignDataWrapper(stmt) = pg().verified_stmt(sql) else {
9252+
unreachable!()
9253+
};
9254+
assert_eq!(stmt.handler, Some(FdwRoutineClause::NoFunction));
9255+
9256+
// With NO VALIDATOR.
9257+
let sql = "CREATE FOREIGN DATA WRAPPER myfdw NO VALIDATOR";
9258+
let Statement::CreateForeignDataWrapper(stmt) = pg().verified_stmt(sql) else {
9259+
unreachable!()
9260+
};
9261+
assert_eq!(stmt.validator, Some(FdwRoutineClause::NoFunction));
9262+
9263+
// With HANDLER, VALIDATOR, and OPTIONS.
9264+
let sql = "CREATE FOREIGN DATA WRAPPER myfdw HANDLER myhandler VALIDATOR myvalidator OPTIONS (debug 'true')";
9265+
let Statement::CreateForeignDataWrapper(stmt) = pg().verified_stmt(sql) else {
9266+
unreachable!()
9267+
};
9268+
assert_eq!(
9269+
stmt.handler,
9270+
Some(FdwRoutineClause::Function(ObjectName::from(vec![
9271+
"myhandler".into()
9272+
])))
9273+
);
9274+
assert_eq!(
9275+
stmt.validator,
9276+
Some(FdwRoutineClause::Function(ObjectName::from(vec![
9277+
"myvalidator".into()
9278+
])))
9279+
);
9280+
let options = stmt.options.unwrap();
9281+
assert_eq!(options.len(), 1);
9282+
assert_eq!(options[0].key.value, "debug");
9283+
assert_eq!(options[0].value.value, "true");
9284+
}
9285+
9286+
#[test]
9287+
fn parse_create_foreign_table() {
9288+
// Basic: columns and SERVER.
9289+
let sql = "CREATE FOREIGN TABLE ft1 (id INTEGER, name TEXT) SERVER myserver";
9290+
let Statement::CreateForeignTable(stmt) = pg().verified_stmt(sql) else {
9291+
unreachable!()
9292+
};
9293+
assert_eq!(stmt.name.to_string(), "ft1");
9294+
assert!(!stmt.if_not_exists);
9295+
assert_eq!(stmt.columns.len(), 2);
9296+
assert_eq!(stmt.columns[0].name.value, "id");
9297+
assert_eq!(stmt.columns[1].name.value, "name");
9298+
assert_eq!(stmt.server_name.value, "myserver");
9299+
assert!(stmt.options.is_none());
9300+
9301+
// With IF NOT EXISTS.
9302+
let sql = "CREATE FOREIGN TABLE IF NOT EXISTS ft2 (col INTEGER) SERVER remoteserver";
9303+
let Statement::CreateForeignTable(stmt) = pg().verified_stmt(sql) else {
9304+
unreachable!()
9305+
};
9306+
assert!(stmt.if_not_exists);
9307+
assert_eq!(stmt.name.to_string(), "ft2");
9308+
9309+
// With table-level OPTIONS.
9310+
let sql =
9311+
"CREATE FOREIGN TABLE ft3 (col INTEGER) SERVER remoteserver OPTIONS (schema_name 'public')";
9312+
let Statement::CreateForeignTable(stmt) = pg().verified_stmt(sql) else {
9313+
unreachable!()
9314+
};
9315+
let options = stmt.options.unwrap();
9316+
assert_eq!(options.len(), 1);
9317+
assert_eq!(options[0].key.value, "schema_name");
9318+
assert_eq!(options[0].value.value, "public");
9319+
}

0 commit comments

Comments
 (0)