{"record":{"id":"57acb271aae2a154","repo":"apache/superset","slug":"errors","errorCode":null,"errorMessage":"errors","messagePattern":"errors","errorType":"validation","errorClass":"InvalidParametersError","httpStatus":422,"severity":"error","filePath":"superset/commands/database/validate.py","lineNumber":63,"sourceCode":"        self._model: Optional[Database] = None\n\n    def run(self) -> None:  # noqa: C901\n        self.validate()\n\n        engine = self._properties[\"engine\"]\n        driver = self._properties.get(\"driver\")\n\n        if engine in BYPASS_VALIDATION_ENGINES:\n            # Skip engines that are only validated onCreate, but still surface\n            # database_name uniqueness and SSH tunnel field errors so the\n            # progressive validation flow stays consistent across engines.\n            errors: list[SupersetError] = []\n            if database_name_error := self._get_database_name_error():\n                errors.append(database_name_error)\n            errors.extend(self._get_ssh_tunnel_errors())\n            if errors:\n                event_logger.log_with_context(action=\"validation_error\", engine=engine)\n                raise InvalidParametersError(errors)\n            return\n\n        engine_spec = get_engine_spec(engine, driver)\n        if not hasattr(engine_spec, \"parameters_schema\"):\n            raise InvalidEngineError(\n                SupersetError(\n                    message=__(\n                        'Engine \"%(engine)s\" cannot be configured through parameters.',\n                        engine=engine,\n                    ),\n                    error_type=SupersetErrorType.GENERIC_DB_ENGINE_ERROR,\n                    level=ErrorLevel.ERROR,\n                ),\n            )\n\n        # perform initial validation (host, port, database, username)\n        errors = engine_spec.validate_parameters(self._properties)  # type: ignore\n","sourceCodeStart":45,"sourceCodeEnd":81,"githubUrl":"https://github.com/apache/superset/blob/f4587218dd19d046c3e4d00063e7d27f8a2ed354/superset/commands/database/validate.py#L45-L81","documentation":"InvalidParametersError raised inside ValidateDatabaseParametersCommand.run for engines in BYPASS_VALIDATION_ENGINES (bigquery, datastore, snowflake). These engines skip parameter-schema validation (they are validated at create time via other flows), but the command still collects database_name uniqueness errors (_get_database_name_error) and SSH tunnel field errors (_get_ssh_tunnel_errors); if any exist, it raises InvalidParametersError(errors) after logging a 'validation_error' event. The payload is a list of SupersetError objects describing each field problem.","triggerScenarios":"Creating/editing a BigQuery, Datastore, or Snowflake connection in the database modal with a database_name that already exists, or with malformed/missing SSH tunnel fields (bad host, port, credentials format); the progressive-validation endpoint fires this before the connection test stage.","commonSituations":"Duplicate friendly names for Snowflake databases across teams; SSH tunnel JSON pasted incomplete; UI field-level validation bypassed by API calls (POST to the validate endpoint) with only engine + name supplied.","solutions":["Read each SupersetError in the response payload — it names the offending field (database_name or ssh_tunnel)","Choose a unique database name, or edit the existing connection instead of creating a new one","Complete/correct all SSH tunnel fields (server address, port, username, credentials) or clear the tunnel if unused","Re-submit validation; only the listed fields block progress for bypass engines"],"exampleFix":"# before: {\"engine\": \"snowflake\", \"database_name\": \"sales\"}  # name already taken\n# after:  {\"engine\": \"snowflake\", \"database_name\": \"sales_prod\"}","handlingStrategy":"try-catch","validationCode":"from superset.daos.database import DatabaseDAO\n\ndef name_available(database_name: str) -> bool:\n    return DatabaseDAO.get_database_by_name(database_name) is None","typeGuard":null,"tryCatchPattern":"from superset.commands.database.exceptions import InvalidParametersError\ntry:\n    ValidateDatabaseParametersCommand(properties).run()\nexcept InvalidParametersError as ex:\n    # ex.errors is a list of SupersetError; map each to its form field\n    for e in ex.errors: mark_field(e)","preventionTips":["Check database_name uniqueness before submitting for bypass engines","Complete or clear SSH tunnel fields entirely","Handle the SupersetError list, not a single message"],"tags":["database-connection","validation","ssh-tunnel","snowflake","bigquery"],"backgroundTag":null,"analyzedSha":"f4587218dd19d046c3e4d00063e7d27f8a2ed354","analyzedAt":"2026-08-14T22:39:27.425Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}