@@ -24,7 +24,7 @@ mod test_utils;
2424
2525use helpers:: attached_token:: AttachedToken ;
2626use sqlparser:: ast:: * ;
27- use sqlparser:: dialect:: { GenericDialect , PostgreSqlDialect } ;
27+ use sqlparser:: dialect:: { GenericDialect , MySqlDialect , PostgreSqlDialect } ;
2828use sqlparser:: parser:: ParserError ;
2929use sqlparser:: tokenizer:: Span ;
3030use test_utils:: * ;
@@ -9221,3 +9221,130 @@ fn parse_lock_table() {
92219221 }
92229222 }
92239223}
9224+
9225+ #[ test]
9226+ fn parse_tablespace_and_reindex_regression_cases ( ) {
9227+ for sql in [
9228+ "CREATE TABLESPACE regress_tblspace LOCATION 'relative'" ,
9229+ "CREATE TABLESPACE regress_tblspace LOCATION ''" ,
9230+ "CREATE TABLESPACE regress_tblspacewith LOCATION '' WITH (some_nonexistent_parameter = true)" ,
9231+ "CREATE TABLESPACE regress_tblspacewith LOCATION '' WITH (random_page_cost = 3.0)" ,
9232+ "DROP TABLESPACE regress_tblspacewith" ,
9233+ "ALTER TABLESPACE regress_tblspace SET (random_page_cost = 1.0, seq_page_cost = 1.1)" ,
9234+ "ALTER TABLESPACE regress_tblspace SET (some_nonexistent_parameter = true)" ,
9235+ "ALTER TABLESPACE regress_tblspace RESET (random_page_cost = 2.0)" ,
9236+ "ALTER TABLESPACE regress_tblspace RESET (random_page_cost, effective_io_concurrency)" ,
9237+ "REINDEX (TABLESPACE regress_tblspace) TABLE pg_am" ,
9238+ "REINDEX (TABLESPACE regress_tblspace) TABLE CONCURRENTLY pg_am" ,
9239+ "REINDEX (TABLESPACE regress_tblspace) TABLE pg_authid" ,
9240+ "REINDEX (TABLESPACE regress_tblspace) TABLE CONCURRENTLY pg_authid" ,
9241+ "REINDEX (TABLESPACE regress_tblspace) INDEX pg_toast.pg_toast_1262_index" ,
9242+ "REINDEX (TABLESPACE regress_tblspace) INDEX CONCURRENTLY pg_toast.pg_toast_1262_index" ,
9243+ "REINDEX (TABLESPACE regress_tblspace) TABLE pg_toast.pg_toast_1262" ,
9244+ "REINDEX (TABLESPACE regress_tblspace) TABLE CONCURRENTLY pg_toast.pg_toast_1262" ,
9245+ "REINDEX (TABLESPACE pg_global) TABLE pg_authid" ,
9246+ "REINDEX (TABLESPACE pg_global) TABLE CONCURRENTLY pg_authid" ,
9247+ "REINDEX (TABLESPACE pg_global) INDEX regress_tblspace_test_tbl_idx" ,
9248+ "REINDEX (TABLESPACE pg_global) INDEX CONCURRENTLY regress_tblspace_test_tbl_idx" ,
9249+ "REINDEX (TABLESPACE regress_tblspace) INDEX regress_tblspace_test_tbl_idx" ,
9250+ "REINDEX (TABLESPACE regress_tblspace) TABLE regress_tblspace_test_tbl" ,
9251+ ] {
9252+ pg_and_generic ( ) . verified_stmt ( sql) ;
9253+ }
9254+ }
9255+
9256+ #[ test]
9257+ fn parse_alter_tablespace_reset_assignment_option ( ) {
9258+ let stmt = pg_and_generic ( )
9259+ . verified_stmt ( "ALTER TABLESPACE regress_tblspace RESET (random_page_cost = 2.0)" ) ;
9260+ let Statement :: AlterTablespace ( AlterTablespace {
9261+ name,
9262+ operation : AlterTablespaceOperation :: Reset { options } ,
9263+ } ) = stmt
9264+ else {
9265+ panic ! ( "Expected ALTER TABLESPACE RESET statement" ) ;
9266+ } ;
9267+
9268+ assert_eq ! ( name. value, "regress_tblspace" ) ;
9269+ assert_eq ! ( options. len( ) , 1 ) ;
9270+ let TablespaceResetOption :: Assign { key, value } = & options[ 0 ] else {
9271+ panic ! ( "Expected assignment form in RESET option list" ) ;
9272+ } ;
9273+ assert_eq ! ( key. value, "random_page_cost" ) ;
9274+ assert_eq ! ( value. to_string( ) , "2.0" ) ;
9275+ }
9276+
9277+ #[ test]
9278+ fn parse_reindex_with_tablespace_utility_option ( ) {
9279+ let stmt = pg_and_generic ( )
9280+ . verified_stmt ( "REINDEX (TABLESPACE regress_tblspace) TABLE CONCURRENTLY pg_am" ) ;
9281+ let Statement :: Reindex ( ReindexStatement {
9282+ options,
9283+ object_type,
9284+ concurrently,
9285+ name,
9286+ } ) = stmt
9287+ else {
9288+ panic ! ( "Expected REINDEX statement" ) ;
9289+ } ;
9290+
9291+ assert_eq ! ( object_type, ReindexObjectType :: Table ) ;
9292+ assert ! ( concurrently) ;
9293+ assert_eq ! ( name. to_string( ) , "pg_am" ) ;
9294+
9295+ let options = options. expect ( "Expected utility options" ) ;
9296+ assert_eq ! ( options. len( ) , 1 ) ;
9297+ assert_eq ! ( options[ 0 ] . name. value, "TABLESPACE" ) ;
9298+ assert_eq ! (
9299+ options[ 0 ] . arg. as_ref( ) . map( ToString :: to_string) ,
9300+ Some ( "regress_tblspace" . to_string( ) )
9301+ ) ;
9302+ }
9303+
9304+ #[ test]
9305+ fn reject_postgres_tablespace_forms_in_mysql_dialect ( ) {
9306+ let mysql = TestedDialects :: new ( vec ! [ Box :: new( MySqlDialect { } ) ] ) ;
9307+ assert ! ( mysql
9308+ . parse_sql_statements( "CREATE TABLESPACE t LOCATION ''" )
9309+ . is_err( ) ) ;
9310+ assert ! ( mysql
9311+ . parse_sql_statements( "ALTER TABLESPACE t SET (random_page_cost = 1.0)" )
9312+ . is_err( ) ) ;
9313+ assert ! ( mysql
9314+ . parse_sql_statements( "DROP TABLESPACE IF EXISTS t" )
9315+ . is_err( ) ) ;
9316+ assert ! ( mysql
9317+ . parse_sql_statements( "REINDEX (TABLESPACE t) TABLE pg_am" )
9318+ . is_err( ) ) ;
9319+ }
9320+
9321+ #[ test]
9322+ fn parse_drop_tablespace_in_postgres ( ) {
9323+ let stmt = pg_and_generic ( ) . verified_stmt ( "DROP TABLESPACE IF EXISTS regress_tblspace" ) ;
9324+ let Statement :: DropTablespace ( DropTablespace {
9325+ if_exists,
9326+ undo,
9327+ name,
9328+ engine,
9329+ } ) = stmt
9330+ else {
9331+ panic ! ( "Expected DROP TABLESPACE statement" ) ;
9332+ } ;
9333+
9334+ assert ! ( if_exists) ;
9335+ assert ! ( !undo) ;
9336+ assert_eq ! ( name. value, "regress_tblspace" ) ;
9337+ assert ! ( engine. is_none( ) ) ;
9338+ }
9339+
9340+ #[ test]
9341+ fn reject_drop_tablespace_cascade_in_postgres ( ) {
9342+ let err = pg ( )
9343+ . parse_sql_statements ( "DROP TABLESPACE regress_tblspace CASCADE" )
9344+ . unwrap_err ( )
9345+ . to_string ( ) ;
9346+ assert ! (
9347+ err. contains( "Expected: end of DROP TABLESPACE statement" ) ,
9348+ "unexpected error: {err}"
9349+ ) ;
9350+ }
0 commit comments