fix(datasets): give possibility to add dataset with slashes in name (#24796)

This commit is contained in:
Stepan 2023-07-28 20:33:08 +03:00 committed by GitHub
parent e2d5046bb7
commit 64ced60f62
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 23 additions and 5 deletions

View File

@ -672,7 +672,7 @@ class DatabaseRestApi(BaseSupersetModelRestApi):
except DatabaseTablesUnexpectedError as ex:
return self.response_422(ex.message)
@expose("/<int:pk>/table/<table_name>/<schema_name>/", methods=("GET",))
@expose("/<int:pk>/table/<path:table_name>/<schema_name>/", methods=("GET",))
@protect()
@check_datasource_access
@safe
@ -735,7 +735,7 @@ class DatabaseRestApi(BaseSupersetModelRestApi):
self.incr_stats("success", self.table_metadata.__name__)
return self.response(200, **table_info)
@expose("/<int:pk>/table_extra/<table_name>/<schema_name>/", methods=("GET",))
@expose("/<int:pk>/table_extra/<path:table_name>/<schema_name>/", methods=("GET",))
@protect()
@check_datasource_access
@safe
@ -798,8 +798,8 @@ class DatabaseRestApi(BaseSupersetModelRestApi):
)
return self.response(200, **payload)
@expose("/<int:pk>/select_star/<table_name>/", methods=("GET",))
@expose("/<int:pk>/select_star/<table_name>/<schema_name>/", methods=("GET",))
@expose("/<int:pk>/select_star/<path:table_name>/", methods=("GET",))
@expose("/<int:pk>/select_star/<path:table_name>/<schema_name>/", methods=("GET",))
@protect()
@check_datasource_access
@safe

View File

@ -935,7 +935,9 @@ class Superset(BaseSupersetView): # pylint: disable=too-many-public-methods
@has_access
@event_logger.log_this
@expose("/fetch_datasource_metadata")
@deprecated(new_target="api/v1/database/<int:pk>/table/<table_name>/<schema_name>/")
@deprecated(
new_target="api/v1/database/<int:pk>/table/<path:table_name>/<schema_name>/"
)
def fetch_datasource_metadata(self) -> FlaskResponse:
"""
Fetch the datasource metadata.

View File

@ -686,6 +686,22 @@ class TestDatabaseApi(SupersetTestCase):
# 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.