@@ -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:: * ;
@@ -9243,3 +9243,130 @@ fn parse_lock_table() {
92439243 }
92449244 }
92459245}
9246+
9247+ #[ test]
9248+ fn parse_tablespace_and_reindex_regression_cases ( ) {
9249+ for sql in [
9250+ "CREATE TABLESPACE regress_tblspace LOCATION 'relative'" ,
9251+ "CREATE TABLESPACE regress_tblspace LOCATION ''" ,
9252+ "CREATE TABLESPACE regress_tblspacewith LOCATION '' WITH (some_nonexistent_parameter = true)" ,
9253+ "CREATE TABLESPACE regress_tblspacewith LOCATION '' WITH (random_page_cost = 3.0)" ,
9254+ "DROP TABLESPACE regress_tblspacewith" ,
9255+ "ALTER TABLESPACE regress_tblspace SET (random_page_cost = 1.0, seq_page_cost = 1.1)" ,
9256+ "ALTER TABLESPACE regress_tblspace SET (some_nonexistent_parameter = true)" ,
9257+ "ALTER TABLESPACE regress_tblspace RESET (random_page_cost = 2.0)" ,
9258+ "ALTER TABLESPACE regress_tblspace RESET (random_page_cost, effective_io_concurrency)" ,
9259+ "REINDEX (TABLESPACE regress_tblspace) TABLE pg_am" ,
9260+ "REINDEX (TABLESPACE regress_tblspace) TABLE CONCURRENTLY pg_am" ,
9261+ "REINDEX (TABLESPACE regress_tblspace) TABLE pg_authid" ,
9262+ "REINDEX (TABLESPACE regress_tblspace) TABLE CONCURRENTLY pg_authid" ,
9263+ "REINDEX (TABLESPACE regress_tblspace) INDEX pg_toast.pg_toast_1262_index" ,
9264+ "REINDEX (TABLESPACE regress_tblspace) INDEX CONCURRENTLY pg_toast.pg_toast_1262_index" ,
9265+ "REINDEX (TABLESPACE regress_tblspace) TABLE pg_toast.pg_toast_1262" ,
9266+ "REINDEX (TABLESPACE regress_tblspace) TABLE CONCURRENTLY pg_toast.pg_toast_1262" ,
9267+ "REINDEX (TABLESPACE pg_global) TABLE pg_authid" ,
9268+ "REINDEX (TABLESPACE pg_global) TABLE CONCURRENTLY pg_authid" ,
9269+ "REINDEX (TABLESPACE pg_global) INDEX regress_tblspace_test_tbl_idx" ,
9270+ "REINDEX (TABLESPACE pg_global) INDEX CONCURRENTLY regress_tblspace_test_tbl_idx" ,
9271+ "REINDEX (TABLESPACE regress_tblspace) INDEX regress_tblspace_test_tbl_idx" ,
9272+ "REINDEX (TABLESPACE regress_tblspace) TABLE regress_tblspace_test_tbl" ,
9273+ ] {
9274+ pg_and_generic ( ) . verified_stmt ( sql) ;
9275+ }
9276+ }
9277+
9278+ #[ test]
9279+ fn parse_alter_tablespace_reset_assignment_option ( ) {
9280+ let stmt = pg_and_generic ( )
9281+ . verified_stmt ( "ALTER TABLESPACE regress_tblspace RESET (random_page_cost = 2.0)" ) ;
9282+ let Statement :: AlterTablespace ( AlterTablespace {
9283+ name,
9284+ operation : AlterTablespaceOperation :: Reset { options } ,
9285+ } ) = stmt
9286+ else {
9287+ panic ! ( "Expected ALTER TABLESPACE RESET statement" ) ;
9288+ } ;
9289+
9290+ assert_eq ! ( name. value, "regress_tblspace" ) ;
9291+ assert_eq ! ( options. len( ) , 1 ) ;
9292+ let TablespaceResetOption :: Assign { key, value } = & options[ 0 ] else {
9293+ panic ! ( "Expected assignment form in RESET option list" ) ;
9294+ } ;
9295+ assert_eq ! ( key. value, "random_page_cost" ) ;
9296+ assert_eq ! ( value. to_string( ) , "2.0" ) ;
9297+ }
9298+
9299+ #[ test]
9300+ fn parse_reindex_with_tablespace_utility_option ( ) {
9301+ let stmt = pg_and_generic ( )
9302+ . verified_stmt ( "REINDEX (TABLESPACE regress_tblspace) TABLE CONCURRENTLY pg_am" ) ;
9303+ let Statement :: Reindex ( ReindexStatement {
9304+ options,
9305+ object_type,
9306+ concurrently,
9307+ name,
9308+ } ) = stmt
9309+ else {
9310+ panic ! ( "Expected REINDEX statement" ) ;
9311+ } ;
9312+
9313+ assert_eq ! ( object_type, ReindexObjectType :: Table ) ;
9314+ assert ! ( concurrently) ;
9315+ assert_eq ! ( name. to_string( ) , "pg_am" ) ;
9316+
9317+ let options = options. expect ( "Expected utility options" ) ;
9318+ assert_eq ! ( options. len( ) , 1 ) ;
9319+ assert_eq ! ( options[ 0 ] . name. value, "TABLESPACE" ) ;
9320+ assert_eq ! (
9321+ options[ 0 ] . arg. as_ref( ) . map( ToString :: to_string) ,
9322+ Some ( "regress_tblspace" . to_string( ) )
9323+ ) ;
9324+ }
9325+
9326+ #[ test]
9327+ fn reject_postgres_tablespace_forms_in_mysql_dialect ( ) {
9328+ let mysql = TestedDialects :: new ( vec ! [ Box :: new( MySqlDialect { } ) ] ) ;
9329+ assert ! ( mysql
9330+ . parse_sql_statements( "CREATE TABLESPACE t LOCATION ''" )
9331+ . is_err( ) ) ;
9332+ assert ! ( mysql
9333+ . parse_sql_statements( "ALTER TABLESPACE t SET (random_page_cost = 1.0)" )
9334+ . is_err( ) ) ;
9335+ assert ! ( mysql
9336+ . parse_sql_statements( "DROP TABLESPACE IF EXISTS t" )
9337+ . is_err( ) ) ;
9338+ assert ! ( mysql
9339+ . parse_sql_statements( "REINDEX (TABLESPACE t) TABLE pg_am" )
9340+ . is_err( ) ) ;
9341+ }
9342+
9343+ #[ test]
9344+ fn parse_drop_tablespace_in_postgres ( ) {
9345+ let stmt = pg_and_generic ( ) . verified_stmt ( "DROP TABLESPACE IF EXISTS regress_tblspace" ) ;
9346+ let Statement :: DropTablespace ( DropTablespace {
9347+ if_exists,
9348+ undo,
9349+ name,
9350+ engine,
9351+ } ) = stmt
9352+ else {
9353+ panic ! ( "Expected DROP TABLESPACE statement" ) ;
9354+ } ;
9355+
9356+ assert ! ( if_exists) ;
9357+ assert ! ( !undo) ;
9358+ assert_eq ! ( name. value, "regress_tblspace" ) ;
9359+ assert ! ( engine. is_none( ) ) ;
9360+ }
9361+
9362+ #[ test]
9363+ fn reject_drop_tablespace_cascade_in_postgres ( ) {
9364+ let err = pg ( )
9365+ . parse_sql_statements ( "DROP TABLESPACE regress_tblspace CASCADE" )
9366+ . unwrap_err ( )
9367+ . to_string ( ) ;
9368+ assert ! (
9369+ err. contains( "Expected: end of DROP TABLESPACE statement" ) ,
9370+ "unexpected error: {err}"
9371+ ) ;
9372+ }
0 commit comments