Skip to content

Commit ef2ce41

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 8ecb6c9 commit ef2ce41

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
@@ -9327,3 +9327,99 @@ fn parse_lock_table() {
93279327
}
93289328
}
93299329
}
9330+
9331+
#[test]
9332+
fn parse_create_foreign_data_wrapper() {
9333+
// Minimal: name only.
9334+
let sql = "CREATE FOREIGN DATA WRAPPER myfdw";
9335+
let Statement::CreateForeignDataWrapper(stmt) = pg().verified_stmt(sql) else {
9336+
unreachable!()
9337+
};
9338+
assert_eq!(stmt.name.value, "myfdw");
9339+
assert!(stmt.handler.is_none());
9340+
assert!(stmt.validator.is_none());
9341+
assert!(stmt.options.is_none());
9342+
9343+
// With HANDLER.
9344+
let sql = "CREATE FOREIGN DATA WRAPPER myfdw HANDLER myhandler";
9345+
let Statement::CreateForeignDataWrapper(stmt) = pg().verified_stmt(sql) else {
9346+
unreachable!()
9347+
};
9348+
assert_eq!(
9349+
stmt.handler,
9350+
Some(FdwRoutineClause::Function(ObjectName::from(vec![
9351+
"myhandler".into()
9352+
])))
9353+
);
9354+
9355+
// With NO HANDLER.
9356+
let sql = "CREATE FOREIGN DATA WRAPPER myfdw NO HANDLER";
9357+
let Statement::CreateForeignDataWrapper(stmt) = pg().verified_stmt(sql) else {
9358+
unreachable!()
9359+
};
9360+
assert_eq!(stmt.handler, Some(FdwRoutineClause::NoFunction));
9361+
9362+
// With NO VALIDATOR.
9363+
let sql = "CREATE FOREIGN DATA WRAPPER myfdw NO VALIDATOR";
9364+
let Statement::CreateForeignDataWrapper(stmt) = pg().verified_stmt(sql) else {
9365+
unreachable!()
9366+
};
9367+
assert_eq!(stmt.validator, Some(FdwRoutineClause::NoFunction));
9368+
9369+
// With HANDLER, VALIDATOR, and OPTIONS.
9370+
let sql = "CREATE FOREIGN DATA WRAPPER myfdw HANDLER myhandler VALIDATOR myvalidator OPTIONS (debug 'true')";
9371+
let Statement::CreateForeignDataWrapper(stmt) = pg().verified_stmt(sql) else {
9372+
unreachable!()
9373+
};
9374+
assert_eq!(
9375+
stmt.handler,
9376+
Some(FdwRoutineClause::Function(ObjectName::from(vec![
9377+
"myhandler".into()
9378+
])))
9379+
);
9380+
assert_eq!(
9381+
stmt.validator,
9382+
Some(FdwRoutineClause::Function(ObjectName::from(vec![
9383+
"myvalidator".into()
9384+
])))
9385+
);
9386+
let options = stmt.options.unwrap();
9387+
assert_eq!(options.len(), 1);
9388+
assert_eq!(options[0].key.value, "debug");
9389+
assert_eq!(options[0].value.value, "true");
9390+
}
9391+
9392+
#[test]
9393+
fn parse_create_foreign_table() {
9394+
// Basic: columns and SERVER.
9395+
let sql = "CREATE FOREIGN TABLE ft1 (id INTEGER, name TEXT) SERVER myserver";
9396+
let Statement::CreateForeignTable(stmt) = pg().verified_stmt(sql) else {
9397+
unreachable!()
9398+
};
9399+
assert_eq!(stmt.name.to_string(), "ft1");
9400+
assert!(!stmt.if_not_exists);
9401+
assert_eq!(stmt.columns.len(), 2);
9402+
assert_eq!(stmt.columns[0].name.value, "id");
9403+
assert_eq!(stmt.columns[1].name.value, "name");
9404+
assert_eq!(stmt.server_name.value, "myserver");
9405+
assert!(stmt.options.is_none());
9406+
9407+
// With IF NOT EXISTS.
9408+
let sql = "CREATE FOREIGN TABLE IF NOT EXISTS ft2 (col INTEGER) SERVER remoteserver";
9409+
let Statement::CreateForeignTable(stmt) = pg().verified_stmt(sql) else {
9410+
unreachable!()
9411+
};
9412+
assert!(stmt.if_not_exists);
9413+
assert_eq!(stmt.name.to_string(), "ft2");
9414+
9415+
// With table-level OPTIONS.
9416+
let sql =
9417+
"CREATE FOREIGN TABLE ft3 (col INTEGER) SERVER remoteserver OPTIONS (schema_name 'public')";
9418+
let Statement::CreateForeignTable(stmt) = pg().verified_stmt(sql) else {
9419+
unreachable!()
9420+
};
9421+
let options = stmt.options.unwrap();
9422+
assert_eq!(options.len(), 1);
9423+
assert_eq!(options[0].key.value, "schema_name");
9424+
assert_eq!(options[0].value.value, "public");
9425+
}

0 commit comments

Comments
 (0)