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