@@ -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