diff --git a/superset/databases/api.py b/superset/databases/api.py index 98932e28e257f..caa46d3164545 100644 --- a/superset/databases/api.py +++ b/superset/databases/api.py @@ -672,7 +672,7 @@ def tables(self, pk: int, **kwargs: Any) -> FlaskResponse: except DatabaseTablesUnexpectedError as ex: return self.response_422(ex.message) - @expose("//table///", methods=("GET",)) + @expose("//table///", methods=("GET",)) @protect() @check_datasource_access @safe @@ -735,7 +735,7 @@ def table_metadata( self.incr_stats("success", self.table_metadata.__name__) return self.response(200, **table_info) - @expose("//table_extra///", methods=("GET",)) + @expose("//table_extra///", methods=("GET",)) @protect() @check_datasource_access @safe @@ -798,8 +798,8 @@ def table_extra_metadata( ) return self.response(200, **payload) - @expose("//select_star//", methods=("GET",)) - @expose("//select_star///", methods=("GET",)) + @expose("//select_star//", methods=("GET",)) + @expose("//select_star///", methods=("GET",)) @protect() @check_datasource_access @safe diff --git a/superset/views/core.py b/superset/views/core.py index 3655da0ed4284..79fb3fbd8b1f8 100755 --- a/superset/views/core.py +++ b/superset/views/core.py @@ -935,7 +935,9 @@ def theme(self) -> FlaskResponse: @has_access @event_logger.log_this @expose("/fetch_datasource_metadata") - @deprecated(new_target="api/v1/database//table///") + @deprecated( + new_target="api/v1/database//table///" + ) def fetch_datasource_metadata(self) -> FlaskResponse: """ Fetch the datasource metadata. diff --git a/tests/integration_tests/databases/api_tests.py b/tests/integration_tests/databases/api_tests.py index ebf94219c3b0a..bd39d965743fd 100644 --- a/tests/integration_tests/databases/api_tests.py +++ b/tests/integration_tests/databases/api_tests.py @@ -686,6 +686,22 @@ def test_if_ssh_tunneling_flag_is_not_active_it_raises_new_exception( # the DB should not be created assert model is None + def test_get_table_details_with_slash_in_table_name(self): + table_name = "table_with/slash" + database = get_example_database() + query = f'CREATE TABLE IF NOT EXISTS "{table_name}" (col VARCHAR(256))' + if database.backend == "mysql": + query = query.replace('"', "`") + + with database.get_sqla_engine_with_context() as engine: + engine.execute(query) + + self.login(username="admin") + uri = f"api/v1/database/{database.id}/table/{table_name}/null/" + rv = self.client.get(uri) + + self.assertEqual(rv.status_code, 200) + def test_create_database_invalid_configuration_method(self): """ Database API: Test create with an invalid configuration method.