You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by ha...@apache.org on 2026/06/14 12:46:56 UTC
(superset) branch master updated: feat(uploads): add optional max file size for data uploads (#40860)
This is an automated email from the ASF dual-hosted git repository.
hainenber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git
The following commit(s) were added to refs/heads/master by this push:
new 9f815656254 feat(uploads): add optional max file size for data uploads (#40860)
9f815656254 is described below
commit 9f8156562545b586a1cb9ef3985d809022b5b0e2
Author: Evan Rusackas <ev...@preset.io>
AuthorDate: Sun Jun 14 05:46:48 2026 -0700
feat(uploads): add optional max file size for data uploads (#40860)
---
UPDATING.md | 4 +
superset/commands/database/exceptions.py | 5 +
superset/commands/database/uploaders/base.py | 41 ++++++
.../commands/database/uploaders/columnar_reader.py | 37 ------
superset/databases/api.py | 19 +++
superset/translations/ar/LC_MESSAGES/messages.po | 9 +-
superset/translations/ca/LC_MESSAGES/messages.po | 9 +-
superset/translations/cs/LC_MESSAGES/messages.po | 9 +-
superset/translations/de/LC_MESSAGES/messages.po | 9 +-
superset/translations/en/LC_MESSAGES/messages.po | 8 +-
superset/translations/es/LC_MESSAGES/messages.po | 9 +-
superset/translations/fa/LC_MESSAGES/messages.po | 9 +-
superset/translations/fi/LC_MESSAGES/messages.po | 11 +-
superset/translations/fr/LC_MESSAGES/messages.po | 9 +-
superset/translations/it/LC_MESSAGES/messages.po | 9 +-
superset/translations/ja/LC_MESSAGES/messages.po | 9 +-
superset/translations/ko/LC_MESSAGES/messages.po | 9 +-
superset/translations/lv/LC_MESSAGES/messages.po | 9 +-
superset/translations/messages.pot | 8 +-
superset/translations/mi/LC_MESSAGES/messages.po | 9 +-
superset/translations/nl/LC_MESSAGES/messages.po | 9 +-
superset/translations/pl/LC_MESSAGES/messages.po | 9 +-
superset/translations/pt/LC_MESSAGES/messages.po | 9 +-
.../translations/pt_BR/LC_MESSAGES/messages.po | 9 +-
superset/translations/ru/LC_MESSAGES/messages.po | 9 +-
superset/translations/sk/LC_MESSAGES/messages.po | 9 +-
superset/translations/sl/LC_MESSAGES/messages.po | 9 +-
superset/translations/th/LC_MESSAGES/messages.po | 11 +-
superset/translations/tr/LC_MESSAGES/messages.po | 9 +-
superset/translations/uk/LC_MESSAGES/messages.po | 9 +-
superset/translations/zh/LC_MESSAGES/messages.po | 9 +-
.../translations/zh_TW/LC_MESSAGES/messages.po | 9 +-
.../commands/databases/columnar_reader_test.py | 49 -------
.../commands/databases/upload_command_test.py | 147 +++++++++++++++++++++
tests/unit_tests/databases/api_test.py | 37 ++++++
35 files changed, 361 insertions(+), 223 deletions(-)
diff --git a/UPDATING.md b/UPDATING.md
index f03677eddb7..af250a4993d 100644
--- a/UPDATING.md
+++ b/UPDATING.md
@@ -67,6 +67,10 @@ Operators can tune or disable the policy via config:
- `FAB_PASSWORD_COMPLEXITY_VALIDATOR` — replace with your own callable for custom rules.
- `FAB_PASSWORD_COMPLEXITY_ENABLED = False` — disable enforcement entirely.
+### Data uploads bounded by UPLOAD_MAX_FILE_SIZE_BYTES
+
+Single data-file uploads (CSV, Excel, columnar) are now bounded by the `UPLOAD_MAX_FILE_SIZE_BYTES` config option, which defaults to `100 * 1024 * 1024` (100 MB). Files larger than this are rejected with a `413` before their contents are buffered into memory. Set `UPLOAD_MAX_FILE_SIZE_BYTES = None` to disable the check and restore unbounded uploads.
+
### Duration formatter precision
The `DURATION` number formatter now uses `Intl.DurationFormat` for locale-aware output. By default, sub-second fields are omitted, so values that previously displayed fractional seconds with `pretty-ms`, such as `10500` milliseconds rendering as `10.5s`, now render as `10s`.
diff --git a/superset/commands/database/exceptions.py b/superset/commands/database/exceptions.py
index 10c1a96c67a..ed9cbfb8a57 100644
--- a/superset/commands/database/exceptions.py
+++ b/superset/commands/database/exceptions.py
@@ -118,6 +118,11 @@ class DatabaseUploadFailed(CommandException):
message = _("Database upload file failed")
+class DatabaseUploadFileTooLarge(CommandException):
+ status = 413
+ message = _("Database upload file exceeds the maximum allowed size.")
+
+
class DatabaseUploadSaveMetadataFailed(CommandException):
status = 500
message = _("Database upload file failed, while saving metadata")
diff --git a/superset/commands/database/uploaders/base.py b/superset/commands/database/uploaders/base.py
index f8e2b389d84..dbe892c1bb5 100644
--- a/superset/commands/database/uploaders/base.py
+++ b/superset/commands/database/uploaders/base.py
@@ -20,6 +20,7 @@ from functools import partial
from typing import Any, Optional, TypedDict
import pandas as pd
+from flask import current_app
from flask_babel import lazy_gettext as _
from werkzeug.datastructures import FileStorage
@@ -29,6 +30,7 @@ from superset.commands.database.exceptions import (
DatabaseNotFoundError,
DatabaseSchemaUploadNotAllowed,
DatabaseUploadFailed,
+ DatabaseUploadFileTooLarge,
DatabaseUploadNotSupported,
DatabaseUploadSaveMetadataFailed,
)
@@ -188,6 +190,43 @@ class UploadCommand(BaseCommand):
sqla_table.fetch_metadata()
+ @staticmethod
+ def _file_size_bytes(file: Any) -> Optional[int]:
+ """
+ Return the size of an uploaded file without consuming its stream.
+
+ Returns ``None`` when the stream is not seekable, in which case the
+ size cannot be determined cheaply and the size check is skipped in
+ favour of downstream guards.
+ """
+ stream = getattr(file, "stream", file)
+ try:
+ position = stream.tell()
+ stream.seek(0, 2) # seek to end
+ size = stream.tell()
+ stream.seek(position) # restore the original position
+ except (AttributeError, OSError):
+ return None
+ return size
+
+ @classmethod
+ def validate_file_size(cls, file: Any) -> None:
+ """
+ Reject a file whose size exceeds ``UPLOAD_MAX_FILE_SIZE_BYTES``.
+
+ Shared by the upload command and the metadata endpoint so oversized
+ files are rejected before their contents are read into memory,
+ regardless of which path is used.
+
+ :raises DatabaseUploadFileTooLarge: if the file is larger than the limit
+ """
+ max_file_size = current_app.config.get("UPLOAD_MAX_FILE_SIZE_BYTES")
+ if max_file_size is None or file is None:
+ return
+ size = cls._file_size_bytes(file)
+ if size is not None and size > max_file_size:
+ raise DatabaseUploadFileTooLarge()
+
def validate(self) -> None:
self._model = DatabaseDAO.find_by_id(self._model_id)
if not self._model:
@@ -196,3 +235,5 @@ class UploadCommand(BaseCommand):
raise DatabaseSchemaUploadNotAllowed()
if not self._model.db_engine_spec.supports_file_upload:
raise DatabaseUploadNotSupported()
+
+ self.validate_file_size(self._file)
diff --git a/superset/commands/database/uploaders/columnar_reader.py b/superset/commands/database/uploaders/columnar_reader.py
index e10f47bc863..d1e29a3eb15 100644
--- a/superset/commands/database/uploaders/columnar_reader.py
+++ b/superset/commands/database/uploaders/columnar_reader.py
@@ -23,7 +23,6 @@ from zipfile import BadZipfile, is_zipfile, ZipFile
import pandas as pd
import pyarrow.parquet as pq
-from flask import current_app
from flask_babel import lazy_gettext as _
from pyarrow.lib import ArrowException
from werkzeug.datastructures import FileStorage
@@ -40,41 +39,6 @@ from superset.utils.core import check_is_safe_zip
logger = logging.getLogger(__name__)
-def _check_file_size(file: FileStorage) -> None:
- """
- Reject an uploaded file whose raw (on-the-wire) size exceeds the configured
- limit before its contents are buffered into memory.
-
- This is complementary to the ZIP decompression-ratio guard: it bounds the
- raw bytes accepted regardless of whether the payload is compressed.
-
- :param file: The uploaded file to check.
- :throws DatabaseUploadFailed: if the file exceeds the configured limit.
- """
- max_size = current_app.config.get("UPLOAD_MAX_FILE_SIZE_BYTES")
- if not max_size:
- return
- stream = file.stream
- try:
- current_position = stream.tell()
- stream.seek(0, 2) # seek to end
- size = stream.tell()
- stream.seek(current_position)
- except (AttributeError, OSError):
- # If the stream is not seekable we cannot determine the size cheaply;
- # skip the check and rely on downstream guards.
- return
- if size > max_size:
- raise DatabaseUploadFailed(
- _(
- "File size %(size)s bytes exceeds the maximum allowed "
- "upload size of %(max_size)s bytes",
- size=size,
- max_size=max_size,
- )
- )
-
-
class ColumnarReaderOptions(ReaderOptions, total=False):
columns_read: list[str]
@@ -118,7 +82,6 @@ class ColumnarReader(BaseDataReader):
:param file: The file to yield files from.
:return: A generator that yields files.
"""
- _check_file_size(file)
file_suffix = Path(file.filename).suffix
if not file_suffix:
raise DatabaseUploadFailed(_("Unexpected no file extension found"))
diff --git a/superset/databases/api.py b/superset/databases/api.py
index 00357019a97..ceeea93a85e 100644
--- a/superset/databases/api.py
+++ b/superset/databases/api.py
@@ -1718,6 +1718,15 @@ class DatabaseRestApi(BaseSupersetModelRestApi):
$ref: '#/components/responses/401'
404:
$ref: '#/components/responses/404'
+ 413:
+ description: Payload too large, file exceeds the maximum allowed size
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ message:
+ type: string
500:
$ref: '#/components/responses/500'
"""
@@ -1727,6 +1736,7 @@ class DatabaseRestApi(BaseSupersetModelRestApi):
parameters = UploadFileMetadataPostSchema().load(request_form)
except ValidationError as error:
return self.response_400(message=error.messages)
+ UploadCommand.validate_file_size(parameters["file"])
if parameters["type"] == UploadFileType.CSV.value:
metadata = CSVReader(parameters).file_metadata(parameters["file"])
elif parameters["type"] == UploadFileType.EXCEL.value:
@@ -1777,6 +1787,15 @@ class DatabaseRestApi(BaseSupersetModelRestApi):
$ref: '#/components/responses/401'
404:
$ref: '#/components/responses/404'
+ 413:
+ description: Payload too large, file exceeds the maximum allowed size
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ message:
+ type: string
422:
$ref: '#/components/responses/422'
500:
diff --git a/superset/translations/ar/LC_MESSAGES/messages.po b/superset/translations/ar/LC_MESSAGES/messages.po
index ceafac0a093..028cace2156 100644
--- a/superset/translations/ar/LC_MESSAGES/messages.po
+++ b/superset/translations/ar/LC_MESSAGES/messages.po
@@ -24,7 +24,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2026-06-05 12:59+0300\n"
+"POT-Creation-Date: 2026-06-08 12:27-0700\n"
"PO-Revision-Date: 2024-07-14 15:10+0300\n"
"Last-Translator: Abdalrahim G. Fakhouri <ab...@yahoo.com>\n"
"Language: ar\n"
@@ -4662,6 +4662,9 @@ msgstr "تم تحديث إعدادات قاعدة البيانات"
msgid "Database type does not support file uploads."
msgstr "قاعدة البيانات لا تدعم الاستعلامات الفرعية"
+msgid "Database upload file exceeds the maximum allowed size."
+msgstr ""
+
#, fuzzy
msgid "Database upload file failed"
msgstr "حدد قاعدة بيانات لتحميل الملف إليها"
@@ -18308,10 +18311,6 @@ msgstr "قيمة تصاعدية"
msgid "value descending"
msgstr "قيمة تنازلي"
-#, fuzzy
-msgid "valuename"
-msgstr "اسم الجدول"
-
msgid "var"
msgstr "VAR"
diff --git a/superset/translations/ca/LC_MESSAGES/messages.po b/superset/translations/ca/LC_MESSAGES/messages.po
index fa697990f3f..35e15ab8ae1 100644
--- a/superset/translations/ca/LC_MESSAGES/messages.po
+++ b/superset/translations/ca/LC_MESSAGES/messages.po
@@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Superset VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2026-06-05 12:59+0300\n"
+"POT-Creation-Date: 2026-06-08 12:27-0700\n"
"PO-Revision-Date: 2025-06-27 12:56+0200\n"
"Last-Translator: FULL NAME <EM...@ADDRESS>\n"
"Language: ca\n"
@@ -4655,6 +4655,9 @@ msgstr "Configuració de base de dades actualitzada"
msgid "Database type does not support file uploads."
msgstr "El tipus de base de dades no suporta pujades de fitxers."
+msgid "Database upload file exceeds the maximum allowed size."
+msgstr ""
+
msgid "Database upload file failed"
msgstr "La pujada de fitxer de base de dades ha fallat"
@@ -18304,10 +18307,6 @@ msgstr "valor ascendent"
msgid "value descending"
msgstr "valor descendent"
-#, fuzzy
-msgid "valuename"
-msgstr "Nom de taula"
-
msgid "var"
msgstr "var"
diff --git a/superset/translations/cs/LC_MESSAGES/messages.po b/superset/translations/cs/LC_MESSAGES/messages.po
index 15d1c2efb0e..993fca3566e 100644
--- a/superset/translations/cs/LC_MESSAGES/messages.po
+++ b/superset/translations/cs/LC_MESSAGES/messages.po
@@ -18,7 +18,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Superset VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2026-06-05 12:59+0300\n"
+"POT-Creation-Date: 2026-06-08 12:27-0700\n"
"PO-Revision-Date: 2016-05-02 08:49-0700\n"
"Last-Translator: Jan Šmejkal <ja...@orgis.cz>\n"
"Language: cs\n"
@@ -4633,6 +4633,9 @@ msgstr "Nastavení databáze aktualizováno"
msgid "Database type does not support file uploads."
msgstr "Typ databáze nepodporuje nahrávání souborů."
+msgid "Database upload file exceeds the maximum allowed size."
+msgstr ""
+
msgid "Database upload file failed"
msgstr "Nahrání souboru do databáze selhalo"
@@ -18245,10 +18248,6 @@ msgstr "hodnota vzestupně"
msgid "value descending"
msgstr "hodnota sestupně"
-#, fuzzy
-msgid "valuename"
-msgstr "Název tabulky"
-
msgid "var"
msgstr "var"
diff --git a/superset/translations/de/LC_MESSAGES/messages.po b/superset/translations/de/LC_MESSAGES/messages.po
index 95668a732dc..daf92e8c180 100644
--- a/superset/translations/de/LC_MESSAGES/messages.po
+++ b/superset/translations/de/LC_MESSAGES/messages.po
@@ -18,7 +18,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2026-06-05 12:59+0300\n"
+"POT-Creation-Date: 2026-06-08 12:27-0700\n"
"PO-Revision-Date: 2023-04-07 19:45+0200\n"
"Last-Translator: Holger Bruch <ho...@wattbewerb.de>\n"
"Language: de\n"
@@ -4723,6 +4723,9 @@ msgstr "Datenbankeinstellungen aktualisiert"
msgid "Database type does not support file uploads."
msgstr "Der Datenbanktyp unterstützt keine Datei-Uploads."
+msgid "Database upload file exceeds the maximum allowed size."
+msgstr ""
+
msgid "Database upload file failed"
msgstr "Datenbank-Upload fehlgeschlagen"
@@ -18686,10 +18689,6 @@ msgstr "Wert aufsteigend"
msgid "value descending"
msgstr "Wert absteigend"
-#, fuzzy
-msgid "valuename"
-msgstr "Tabellenname"
-
msgid "var"
msgstr "var"
diff --git a/superset/translations/en/LC_MESSAGES/messages.po b/superset/translations/en/LC_MESSAGES/messages.po
index d65afc6ef84..b73f3fcabee 100644
--- a/superset/translations/en/LC_MESSAGES/messages.po
+++ b/superset/translations/en/LC_MESSAGES/messages.po
@@ -17,7 +17,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2026-06-05 12:59+0300\n"
+"POT-Creation-Date: 2026-06-08 12:27-0700\n"
"PO-Revision-Date: 2016-05-02 08:49-0700\n"
"Last-Translator: FULL NAME <EM...@ADDRESS>\n"
"Language: en\n"
@@ -4201,6 +4201,9 @@ msgstr ""
msgid "Database type does not support file uploads."
msgstr ""
+msgid "Database upload file exceeds the maximum allowed size."
+msgstr ""
+
msgid "Database upload file failed"
msgstr ""
@@ -16447,9 +16450,6 @@ msgstr ""
msgid "value descending"
msgstr ""
-msgid "valuename"
-msgstr ""
-
msgid "var"
msgstr ""
diff --git a/superset/translations/es/LC_MESSAGES/messages.po b/superset/translations/es/LC_MESSAGES/messages.po
index e15a2388553..7dd551fb29b 100644
--- a/superset/translations/es/LC_MESSAGES/messages.po
+++ b/superset/translations/es/LC_MESSAGES/messages.po
@@ -17,7 +17,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2026-06-05 12:59+0300\n"
+"POT-Creation-Date: 2026-06-08 12:27-0700\n"
"PO-Revision-Date: 2016-05-02 08:49-0700\n"
"Last-Translator: FULL NAME <EM...@ADDRESS>\n"
"Language: es\n"
@@ -4818,6 +4818,9 @@ msgstr "Configuración de la base de datos actualizada"
msgid "Database type does not support file uploads."
msgstr "El tipo de base de datos no admite subidas de archivos."
+msgid "Database upload file exceeds the maximum allowed size."
+msgstr ""
+
msgid "Database upload file failed"
msgstr "La subida de la base de datos ha fallado"
@@ -19025,10 +19028,6 @@ msgstr "valor ascendente"
msgid "value descending"
msgstr "valor descendente"
-#, fuzzy
-msgid "valuename"
-msgstr "Nombre de la tabla"
-
msgid "var"
msgstr "var."
diff --git a/superset/translations/fa/LC_MESSAGES/messages.po b/superset/translations/fa/LC_MESSAGES/messages.po
index d8bb4016140..95f44bc0fc5 100644
--- a/superset/translations/fa/LC_MESSAGES/messages.po
+++ b/superset/translations/fa/LC_MESSAGES/messages.po
@@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Superset VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2026-06-05 12:59+0300\n"
+"POT-Creation-Date: 2026-06-08 12:27-0700\n"
"PO-Revision-Date: 2024-10-20 00:07+0330\n"
"Last-Translator: Emad Rad <co...@gmail.com>\n"
"Language: fa\n"
@@ -4600,6 +4600,9 @@ msgstr "تنظیمات پایگاه داده بهروزرسانی شدند"
msgid "Database type does not support file uploads."
msgstr "نوع پایگاه داده از بارگذاری فایل پشتیبانی نمیکند."
+msgid "Database upload file exceeds the maximum allowed size."
+msgstr ""
+
msgid "Database upload file failed"
msgstr "بارگذاری فایل پایگاه داده ناموفق بود"
@@ -18233,10 +18236,6 @@ msgstr "مقدار صعودی"
msgid "value descending"
msgstr "مقدار نزولی"
-#, fuzzy
-msgid "valuename"
-msgstr "نام جدول"
-
msgid "var"
msgstr "متغیر"
diff --git a/superset/translations/fi/LC_MESSAGES/messages.po b/superset/translations/fi/LC_MESSAGES/messages.po
index afbdd4ca004..4f007a27e9d 100644
--- a/superset/translations/fi/LC_MESSAGES/messages.po
+++ b/superset/translations/fi/LC_MESSAGES/messages.po
@@ -17,7 +17,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Superset VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2026-06-05 12:59+0300\n"
+"POT-Creation-Date: 2026-06-08 12:27-0700\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EM...@ADDRESS>\n"
"Language: fi\n"
@@ -8152,6 +8152,9 @@ msgstr "Tietokannan asetukset päivitetty"
msgid "Database type does not support file uploads."
msgstr "Tietokantityyppi ei tue tiedostojen lataamista."
+msgid "Database upload file exceeds the maximum allowed size."
+msgstr ""
+
# Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ca, cs, de,
# es, fa, fr, ja, lv, mi, ru, sk, sl, uk]
#, fuzzy
@@ -32066,12 +32069,6 @@ msgstr "arvo nouseva"
msgid "value descending"
msgstr "arvo laskeva"
-# Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ca, cs, es,
-# fr, ja, lv, mi, ru, sk, uk]
-#, fuzzy
-msgid "valuename"
-msgstr "Taulukon nimi"
-
# Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs,
# de, es, fa, fr, ja, lv, mi, nl, pt_BR, ru, sk, sl, uk]
#, fuzzy
diff --git a/superset/translations/fr/LC_MESSAGES/messages.po b/superset/translations/fr/LC_MESSAGES/messages.po
index fdad5b82232..43e2d1cea27 100644
--- a/superset/translations/fr/LC_MESSAGES/messages.po
+++ b/superset/translations/fr/LC_MESSAGES/messages.po
@@ -17,7 +17,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2026-06-05 12:59+0300\n"
+"POT-Creation-Date: 2026-06-08 12:27-0700\n"
"PO-Revision-Date: 2025-06-26 15:34+0200\n"
"Last-Translator: \n"
"Language: fr\n"
@@ -4655,6 +4655,9 @@ msgstr "Mise à jour des paramètres de la base de données"
msgid "Database type does not support file uploads."
msgstr "La base de données ne prend pas en charge le chargement de fichiers"
+msgid "Database upload file exceeds the maximum allowed size."
+msgstr ""
+
msgid "Database upload file failed"
msgstr "Le chargement de fichier dans la base a échoué"
@@ -18862,10 +18865,6 @@ msgstr "valeurs croissantes"
msgid "value descending"
msgstr "valeurs décroissantes"
-#, fuzzy
-msgid "valuename"
-msgstr "Nom du tableau"
-
msgid "var"
msgstr "var"
diff --git a/superset/translations/it/LC_MESSAGES/messages.po b/superset/translations/it/LC_MESSAGES/messages.po
index 2b7d33087fa..3aee82337f3 100644
--- a/superset/translations/it/LC_MESSAGES/messages.po
+++ b/superset/translations/it/LC_MESSAGES/messages.po
@@ -17,7 +17,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2026-06-05 12:59+0300\n"
+"POT-Creation-Date: 2026-06-08 12:27-0700\n"
"PO-Revision-Date: 2018-02-11 22:26+0200\n"
"Last-Translator: Raffaele Spangaro <ra...@raffaelespangaro.it>\n"
"Language: it\n"
@@ -4563,6 +4563,9 @@ msgstr "La tua query non può essere salvata"
msgid "Database type does not support file uploads."
msgstr "Sorgente dati e tipo di grafico"
+msgid "Database upload file exceeds the maximum allowed size."
+msgstr ""
+
#, fuzzy
msgid "Database upload file failed"
msgstr "La tua query non può essere salvata"
@@ -17932,10 +17935,6 @@ msgstr "Importa"
msgid "value descending"
msgstr "Importa"
-#, fuzzy
-msgid "valuename"
-msgstr "Database"
-
msgid "var"
msgstr ""
diff --git a/superset/translations/ja/LC_MESSAGES/messages.po b/superset/translations/ja/LC_MESSAGES/messages.po
index e6cba1bff4b..503c3b54d5e 100644
--- a/superset/translations/ja/LC_MESSAGES/messages.po
+++ b/superset/translations/ja/LC_MESSAGES/messages.po
@@ -17,7 +17,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2026-06-05 12:59+0300\n"
+"POT-Creation-Date: 2026-06-08 12:27-0700\n"
"PO-Revision-Date: 2024-05-14 13:30+0900\n"
"Last-Translator: Yuri Umezaki <bu...@gmail.com>\n"
"Language: ja\n"
@@ -4298,6 +4298,9 @@ msgstr "データベース設定を更新しました"
msgid "Database type does not support file uploads."
msgstr "このデータベース種類はファイルアップロードをサポートしていません。"
+msgid "Database upload file exceeds the maximum allowed size."
+msgstr ""
+
msgid "Database upload file failed"
msgstr "データベースへのファイルアップロードに失敗しました"
@@ -16821,10 +16824,6 @@ msgstr "値の昇順"
msgid "value descending"
msgstr "値の降順"
-#, fuzzy
-msgid "valuename"
-msgstr "テーブル名"
-
msgid "var"
msgstr "分散"
diff --git a/superset/translations/ko/LC_MESSAGES/messages.po b/superset/translations/ko/LC_MESSAGES/messages.po
index 82c74d19375..669e81ca315 100644
--- a/superset/translations/ko/LC_MESSAGES/messages.po
+++ b/superset/translations/ko/LC_MESSAGES/messages.po
@@ -17,7 +17,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2026-06-05 12:59+0300\n"
+"POT-Creation-Date: 2026-06-08 12:27-0700\n"
"PO-Revision-Date: 2019-02-02 22:28+0900\n"
"Last-Translator: \n"
"Language: ko\n"
@@ -4542,6 +4542,9 @@ msgstr "데이터베이스를 업데이트할 수 없습니다."
msgid "Database type does not support file uploads."
msgstr ""
+msgid "Database upload file exceeds the maximum allowed size."
+msgstr ""
+
msgid "Database upload file failed"
msgstr ""
@@ -17766,10 +17769,6 @@ msgstr ""
msgid "value descending"
msgstr ""
-#, fuzzy
-msgid "valuename"
-msgstr "테이블 명"
-
msgid "var"
msgstr ""
diff --git a/superset/translations/lv/LC_MESSAGES/messages.po b/superset/translations/lv/LC_MESSAGES/messages.po
index 6594cc85eb4..7c358522b61 100644
--- a/superset/translations/lv/LC_MESSAGES/messages.po
+++ b/superset/translations/lv/LC_MESSAGES/messages.po
@@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Superset VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2026-06-05 12:59+0300\n"
+"POT-Creation-Date: 2026-06-08 12:27-0700\n"
"PO-Revision-Date: 2026-03-27 14:01+0200\n"
"Last-Translator: FULL NAME <EM...@ADDRESS>\n"
"Language: lv\n"
@@ -4572,6 +4572,9 @@ msgstr "Datubāzes iestatījumi atjaunināti"
msgid "Database type does not support file uploads."
msgstr "Datubāzes tips neatbalsta failu augšupielādi."
+msgid "Database upload file exceeds the maximum allowed size."
+msgstr ""
+
msgid "Database upload file failed"
msgstr "Datubāzes faila augšupielāde neizdevās"
@@ -17865,10 +17868,6 @@ msgstr "vērtība augošā secībā"
msgid "value descending"
msgstr "vērtība dilstošā secībā"
-#, fuzzy
-msgid "valuename"
-msgstr "Tabulas nosaukums"
-
msgid "var"
msgstr "dispersija"
diff --git a/superset/translations/messages.pot b/superset/translations/messages.pot
index f60a45bdae5..952cfc11567 100644
--- a/superset/translations/messages.pot
+++ b/superset/translations/messages.pot
@@ -25,7 +25,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Superset VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2026-06-05 12:59+0300\n"
+"POT-Creation-Date: 2026-06-08 12:27-0700\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EM...@ADDRESS>\n"
"Language-Team: LANGUAGE <LL...@li.org>\n"
@@ -4203,6 +4203,9 @@ msgstr ""
msgid "Database type does not support file uploads."
msgstr ""
+msgid "Database upload file exceeds the maximum allowed size."
+msgstr ""
+
msgid "Database upload file failed"
msgstr ""
@@ -16422,9 +16425,6 @@ msgstr ""
msgid "value descending"
msgstr ""
-msgid "valuename"
-msgstr ""
-
msgid "var"
msgstr ""
diff --git a/superset/translations/mi/LC_MESSAGES/messages.po b/superset/translations/mi/LC_MESSAGES/messages.po
index 87a9601b931..815ca3dc479 100644
--- a/superset/translations/mi/LC_MESSAGES/messages.po
+++ b/superset/translations/mi/LC_MESSAGES/messages.po
@@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Superset VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2026-06-05 12:59+0300\n"
+"POT-Creation-Date: 2026-06-08 12:27-0700\n"
"PO-Revision-Date: 2026-01-25 16:09+1300\n"
"Last-Translator: karo.co.nz\n"
"Language: mi\n"
@@ -4584,6 +4584,9 @@ msgstr "Kua whakahouhia ngā tautuhinga pātengi raraunga"
msgid "Database type does not support file uploads."
msgstr "Karekau e tautoko te momo pātengi raraunga i ngā tukuake kōnae."
+msgid "Database upload file exceeds the maximum allowed size."
+msgstr ""
+
msgid "Database upload file failed"
msgstr "I rahua te tukuake kōnae pātengi raraunga"
@@ -18224,10 +18227,6 @@ msgstr "uara piki"
msgid "value descending"
msgstr "uara heke"
-#, fuzzy
-msgid "valuename"
-msgstr "Ingoa ripanga"
-
msgid "var"
msgstr "var"
diff --git a/superset/translations/nl/LC_MESSAGES/messages.po b/superset/translations/nl/LC_MESSAGES/messages.po
index c2b74854f27..b8bf71f3d7d 100644
--- a/superset/translations/nl/LC_MESSAGES/messages.po
+++ b/superset/translations/nl/LC_MESSAGES/messages.po
@@ -13,7 +13,7 @@ msgid ""
msgstr ""
"Project-Id-Version: superset-ds\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2026-06-05 12:59+0300\n"
+"POT-Creation-Date: 2026-06-08 12:27-0700\n"
"PO-Revision-Date: 2024-05-08 14:41+0000\n"
"Last-Translator: \n"
"Language: nl\n"
@@ -4688,6 +4688,9 @@ msgstr "Database instellingen bijgewerkt"
msgid "Database type does not support file uploads."
msgstr "Database ondersteunt geen subquery’s"
+msgid "Database upload file exceeds the maximum allowed size."
+msgstr ""
+
#, fuzzy
msgid "Database upload file failed"
msgstr "Selecteer een database om het bestand naar te uploaden"
@@ -18511,10 +18514,6 @@ msgstr "waarde oplopend"
msgid "value descending"
msgstr "waarde aflopend"
-#, fuzzy
-msgid "valuename"
-msgstr "Tabel Naam"
-
msgid "var"
msgstr "var"
diff --git a/superset/translations/pl/LC_MESSAGES/messages.po b/superset/translations/pl/LC_MESSAGES/messages.po
index 5913560dee2..c91f1b192e4 100644
--- a/superset/translations/pl/LC_MESSAGES/messages.po
+++ b/superset/translations/pl/LC_MESSAGES/messages.po
@@ -17,7 +17,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2026-06-05 12:59+0300\n"
+"POT-Creation-Date: 2026-06-08 12:27-0700\n"
"PO-Revision-Date: 2021-11-16 17:33+0100\n"
"Last-Translator: FULL NAME <EM...@ADDRESS>\n"
"Language: fr\n"
@@ -4797,6 +4797,9 @@ msgstr "Ustawienia bazy danych zaktualizowane"
msgid "Database type does not support file uploads."
msgstr "Typ bazy danych nie obsługuje przesyłania plików."
+msgid "Database upload file exceeds the maximum allowed size."
+msgstr ""
+
#, fuzzy
msgid "Database upload file failed"
msgstr "Nie udało się przesłać pliku do bazy danych"
@@ -19161,10 +19164,6 @@ msgstr "wartości rosnące"
msgid "value descending"
msgstr "wartości malejące"
-#, fuzzy
-msgid "valuename"
-msgstr "Nazwa tabeli"
-
#, fuzzy
msgid "var"
msgstr "zmienność"
diff --git a/superset/translations/pt/LC_MESSAGES/messages.po b/superset/translations/pt/LC_MESSAGES/messages.po
index 6cba7ea17f7..09b82fce650 100644
--- a/superset/translations/pt/LC_MESSAGES/messages.po
+++ b/superset/translations/pt/LC_MESSAGES/messages.po
@@ -17,7 +17,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2026-06-05 12:59+0300\n"
+"POT-Creation-Date: 2026-06-08 12:27-0700\n"
"PO-Revision-Date: 2018-03-12 16:24+0000\n"
"Last-Translator: Nuno Heli Beires <nu...@douroeci.com>\n"
"Language: pt\n"
@@ -4628,6 +4628,9 @@ msgstr "Não foi possível gravar a sua query"
msgid "Database type does not support file uploads."
msgstr "Origem de dados %(name)s já existe"
+msgid "Database upload file exceeds the maximum allowed size."
+msgstr ""
+
#, fuzzy
msgid "Database upload file failed"
msgstr "Camadas de anotação"
@@ -18175,10 +18178,6 @@ msgstr "Ordenar decrescente"
msgid "value descending"
msgstr "Ordenar decrescente"
-#, fuzzy
-msgid "valuename"
-msgstr "Nome da Tabela"
-
msgid "var"
msgstr ""
diff --git a/superset/translations/pt_BR/LC_MESSAGES/messages.po b/superset/translations/pt_BR/LC_MESSAGES/messages.po
index c08310bf055..41f5abc9d4f 100644
--- a/superset/translations/pt_BR/LC_MESSAGES/messages.po
+++ b/superset/translations/pt_BR/LC_MESSAGES/messages.po
@@ -17,7 +17,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2026-06-05 12:59+0300\n"
+"POT-Creation-Date: 2026-06-08 12:27-0700\n"
"PO-Revision-Date: 2023-05-22 08:04-0400\n"
"Last-Translator: \n"
"Language: pt_BR\n"
@@ -4790,6 +4790,9 @@ msgstr "Configurações do banco de dados atualizadas"
msgid "Database type does not support file uploads."
msgstr "O banco de dados não é compatível com subconsultas"
+msgid "Database upload file exceeds the maximum allowed size."
+msgstr ""
+
#, fuzzy
msgid "Database upload file failed"
msgstr "Selecione um banco de dados para enviar o arquivo"
@@ -18754,10 +18757,6 @@ msgstr "valor crescente"
msgid "value descending"
msgstr "valor decrescente"
-#, fuzzy
-msgid "valuename"
-msgstr "Nome da Tabela"
-
msgid "var"
msgstr "var"
diff --git a/superset/translations/ru/LC_MESSAGES/messages.po b/superset/translations/ru/LC_MESSAGES/messages.po
index 4a031d56339..bb82613eb00 100644
--- a/superset/translations/ru/LC_MESSAGES/messages.po
+++ b/superset/translations/ru/LC_MESSAGES/messages.po
@@ -17,7 +17,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2026-06-05 12:59+0300\n"
+"POT-Creation-Date: 2026-06-08 12:27-0700\n"
"PO-Revision-Date: 2025-11-05 14:37+0300\n"
"Last-Translator: innovark\n"
"Language: ru\n"
@@ -4553,6 +4553,9 @@ msgstr "Настройки базы данных обновлены"
msgid "Database type does not support file uploads."
msgstr "База данных не поддерживает загрузку файлов"
+msgid "Database upload file exceeds the maximum allowed size."
+msgstr ""
+
msgid "Database upload file failed"
msgstr "Произошла ошибка при загрузке файла в базу данных"
@@ -17862,10 +17865,6 @@ msgstr "по возрастанию значения"
msgid "value descending"
msgstr "по убыванию значения"
-#, fuzzy
-msgid "valuename"
-msgstr "Имя таблицы"
-
msgid "var"
msgstr "дисперсия"
diff --git a/superset/translations/sk/LC_MESSAGES/messages.po b/superset/translations/sk/LC_MESSAGES/messages.po
index f51331b19bc..5c26beb20a2 100644
--- a/superset/translations/sk/LC_MESSAGES/messages.po
+++ b/superset/translations/sk/LC_MESSAGES/messages.po
@@ -17,7 +17,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2026-06-05 12:59+0300\n"
+"POT-Creation-Date: 2026-06-08 12:27-0700\n"
"PO-Revision-Date: 2026-05-18 15:42+0200\n"
"Last-Translator: FULL NAME <EM...@ADDRESS>\n"
"Language: sk\n"
@@ -4633,6 +4633,9 @@ msgstr "Nastavenie databáza aktualizované"
msgid "Database type does not support file uploads."
msgstr "Typ databáza nepodporuje nahrávanie súborov."
+msgid "Database upload file exceeds the maximum allowed size."
+msgstr ""
+
msgid "Database upload file failed"
msgstr "Nahranie súboru do databáza zlyhalo"
@@ -18268,10 +18271,6 @@ msgstr "hodnota vzestupne"
msgid "value descending"
msgstr "hodnota sestupne"
-#, fuzzy
-msgid "valuename"
-msgstr "Názov tabuľky"
-
msgid "var"
msgstr "var"
diff --git a/superset/translations/sl/LC_MESSAGES/messages.po b/superset/translations/sl/LC_MESSAGES/messages.po
index ec55264802b..31cf937bce5 100644
--- a/superset/translations/sl/LC_MESSAGES/messages.po
+++ b/superset/translations/sl/LC_MESSAGES/messages.po
@@ -17,7 +17,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Superset\n"
"Report-Msgid-Bugs-To: dkrat7 @github.com\n"
-"POT-Creation-Date: 2026-06-05 12:59+0300\n"
+"POT-Creation-Date: 2026-06-08 12:27-0700\n"
"PO-Revision-Date: 2024-10-05 23:46+0200\n"
"Last-Translator: dkrat7 <dkrat7 @github.com>\n"
"Language: sl_SI\n"
@@ -4654,6 +4654,9 @@ msgstr "Nastavitve podatkovne baze posodobljene"
msgid "Database type does not support file uploads."
msgstr "Tip podatkovne baze ne podpira nalaganje datotek."
+msgid "Database upload file exceeds the maximum allowed size."
+msgstr ""
+
msgid "Database upload file failed"
msgstr "Nalaganje datoteke v podatkovno bazo ni uspelo"
@@ -18287,10 +18290,6 @@ msgstr "0 - 9"
msgid "value descending"
msgstr "9 - 0"
-#, fuzzy
-msgid "valuename"
-msgstr "Ime tabele"
-
msgid "var"
msgstr "var"
diff --git a/superset/translations/th/LC_MESSAGES/messages.po b/superset/translations/th/LC_MESSAGES/messages.po
index 0256e60dbb6..913f1b2d166 100644
--- a/superset/translations/th/LC_MESSAGES/messages.po
+++ b/superset/translations/th/LC_MESSAGES/messages.po
@@ -17,7 +17,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Superset VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2026-06-05 12:59+0300\n"
+"POT-Creation-Date: 2026-06-08 12:27-0700\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EM...@ADDRESS>\n"
"Language: th\n"
@@ -8012,6 +8012,9 @@ msgstr "อัปเดตการตั้งค่าฐานข้อมู
msgid "Database type does not support file uploads."
msgstr "ประเภทฐานข้อมูลนี้ไม่รองรับการอัปโหลดไฟล์"
+msgid "Database upload file exceeds the maximum allowed size."
+msgstr ""
+
# Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ca, cs, de,
# es, fa, fr, ja, lv, mi, ru, sk, sl, uk]
#, fuzzy
@@ -31704,12 +31707,6 @@ msgstr "ค่าจากน้อยไปมาก"
msgid "value descending"
msgstr "ค่าจากมากไปน้อย"
-# Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ca, cs, es,
-# fr, ja, lv, mi, ru, sk, uk]
-#, fuzzy
-msgid "valuename"
-msgstr "ชื่อตาราง"
-
# Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs,
# de, es, fa, fr, ja, lv, mi, nl, pt_BR, ru, sk, sl, uk]
#, fuzzy
diff --git a/superset/translations/tr/LC_MESSAGES/messages.po b/superset/translations/tr/LC_MESSAGES/messages.po
index 86b48b3846b..f1f86ac711a 100644
--- a/superset/translations/tr/LC_MESSAGES/messages.po
+++ b/superset/translations/tr/LC_MESSAGES/messages.po
@@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Superset VERSION\n"
"Report-Msgid-Bugs-To: avsarcoteli@gmail.com\n"
-"POT-Creation-Date: 2026-06-05 12:59+0300\n"
+"POT-Creation-Date: 2026-06-08 12:27-0700\n"
"PO-Revision-Date: 2024-02-25 14:00+0300\n"
"Last-Translator: FULL NAME <EM...@ADDRESS>\n"
"Language: tr\n"
@@ -4360,6 +4360,9 @@ msgstr "Veritabanı ayarları güncellendi"
msgid "Database type does not support file uploads."
msgstr ""
+msgid "Database upload file exceeds the maximum allowed size."
+msgstr ""
+
#, fuzzy
msgid "Database upload file failed"
msgstr "Veriseti silme işlemi gerçekleşmedi."
@@ -17093,10 +17096,6 @@ msgstr ""
msgid "value descending"
msgstr ""
-#, fuzzy
-msgid "valuename"
-msgstr "Tablo ismi"
-
msgid "var"
msgstr ""
diff --git a/superset/translations/uk/LC_MESSAGES/messages.po b/superset/translations/uk/LC_MESSAGES/messages.po
index c18720953ee..5899c92b228 100644
--- a/superset/translations/uk/LC_MESSAGES/messages.po
+++ b/superset/translations/uk/LC_MESSAGES/messages.po
@@ -18,7 +18,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: ted.korostiled@gmail.com\n"
-"POT-Creation-Date: 2026-06-05 12:59+0300\n"
+"POT-Creation-Date: 2026-06-08 12:27-0700\n"
"PO-Revision-Date: 2026-04-30 22:04+0300\n"
"Last-Translator: Danylo Korostil\n"
"Language: uk\n"
@@ -4543,6 +4543,9 @@ msgstr "Параметри бази даних оновлено"
msgid "Database type does not support file uploads."
msgstr "База даних не підтримує підвантаження файлів."
+msgid "Database upload file exceeds the maximum allowed size."
+msgstr ""
+
msgid "Database upload file failed"
msgstr "Не вдалося вивантажити файл до бази даних"
@@ -17819,10 +17822,6 @@ msgstr "значення за зростанням"
msgid "value descending"
msgstr "значення за спаданням"
-#, fuzzy
-msgid "valuename"
-msgstr "Назва таблиці"
-
msgid "var"
msgstr "дисперсія"
diff --git a/superset/translations/zh/LC_MESSAGES/messages.po b/superset/translations/zh/LC_MESSAGES/messages.po
index 920893918e2..40f55257fea 100644
--- a/superset/translations/zh/LC_MESSAGES/messages.po
+++ b/superset/translations/zh/LC_MESSAGES/messages.po
@@ -18,7 +18,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Apache Superset 0.22.1\n"
"Report-Msgid-Bugs-To: zhouyao94@qq.com\n"
-"POT-Creation-Date: 2026-06-05 12:59+0300\n"
+"POT-Creation-Date: 2026-06-08 12:27-0700\n"
"PO-Revision-Date: 2019-01-04 22:19+0800\n"
"Last-Translator: cdmikechen \n"
"Language: zh\n"
@@ -4604,6 +4604,9 @@ msgstr "数据库设置已更新"
msgid "Database type does not support file uploads."
msgstr "数据库不支持子查询"
+msgid "Database upload file exceeds the maximum allowed size."
+msgstr ""
+
#, fuzzy
msgid "Database upload file failed"
msgstr "选择将要上传文件的数据库"
@@ -18144,10 +18147,6 @@ msgstr "升序"
msgid "value descending"
msgstr "降序"
-#, fuzzy
-msgid "valuename"
-msgstr "表名"
-
#, fuzzy
msgid "var"
msgstr "变量"
diff --git a/superset/translations/zh_TW/LC_MESSAGES/messages.po b/superset/translations/zh_TW/LC_MESSAGES/messages.po
index ac9b7e54b54..54656b34238 100644
--- a/superset/translations/zh_TW/LC_MESSAGES/messages.po
+++ b/superset/translations/zh_TW/LC_MESSAGES/messages.po
@@ -17,7 +17,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Apache Superset 0.22.1\n"
"Report-Msgid-Bugs-To: bestlong168@gmail.com\n"
-"POT-Creation-Date: 2026-06-05 12:59+0300\n"
+"POT-Creation-Date: 2026-06-08 12:27-0700\n"
"PO-Revision-Date: 2019-01-04 22:19+0800\n"
"Last-Translator: Shao Yu-Lung <be...@gmail.com>\n"
"Language: zh_TW\n"
@@ -4606,6 +4606,9 @@ msgstr "資料庫設定已更新"
msgid "Database type does not support file uploads."
msgstr "資料庫不支持子查詢"
+msgid "Database upload file exceeds the maximum allowed size."
+msgstr ""
+
#, fuzzy
msgid "Database upload file failed"
msgstr "選擇將要上傳文件的資料庫"
@@ -18156,10 +18159,6 @@ msgstr "升序"
msgid "value descending"
msgstr "降序"
-#, fuzzy
-msgid "valuename"
-msgstr "表名"
-
#, fuzzy
msgid "var"
msgstr "變量"
diff --git a/tests/unit_tests/commands/databases/columnar_reader_test.py b/tests/unit_tests/commands/databases/columnar_reader_test.py
index 6b79ccf5737..1172e47627c 100644
--- a/tests/unit_tests/commands/databases/columnar_reader_test.py
+++ b/tests/unit_tests/commands/databases/columnar_reader_test.py
@@ -17,12 +17,10 @@
import io
import tempfile
from typing import Any
-from unittest.mock import patch
from zipfile import ZIP_DEFLATED, ZipFile
import numpy as np
import pytest
-from flask import current_app
from werkzeug.datastructures import FileStorage
from superset.commands.database.exceptions import DatabaseUploadFailed
@@ -266,53 +264,6 @@ def test_columnar_reader_unsafe_zip_rejected_in_metadata():
assert "compress ratio above allowed threshold" in str(ex.value)
-def test_columnar_reader_oversize_file_rejected():
- reader = ColumnarReader(
- options=ColumnarReaderOptions(),
- )
- file = create_columnar_file(COLUMNAR_DATA)
- file.stream.seek(0, 2)
- file_size = file.stream.tell()
- file.stream.seek(0)
- with patch.dict(
- current_app.config,
- {"UPLOAD_MAX_FILE_SIZE_BYTES": file_size - 1},
- ):
- with pytest.raises(DatabaseUploadFailed) as ex:
- reader.file_to_dataframe(file)
- assert "exceeds the maximum allowed upload size" in str(ex.value)
-
-
-def test_columnar_reader_oversize_file_rejected_in_metadata():
- reader = ColumnarReader(
- options=ColumnarReaderOptions(),
- )
- file = create_columnar_file(COLUMNAR_DATA)
- file.stream.seek(0, 2)
- file_size = file.stream.tell()
- file.stream.seek(0)
- with patch.dict(
- current_app.config,
- {"UPLOAD_MAX_FILE_SIZE_BYTES": file_size - 1},
- ):
- with pytest.raises(DatabaseUploadFailed) as ex:
- reader.file_metadata(file)
- assert "exceeds the maximum allowed upload size" in str(ex.value)
-
-
-def test_columnar_reader_under_limit_accepted():
- reader = ColumnarReader(
- options=ColumnarReaderOptions(),
- )
- file = create_columnar_file(COLUMNAR_DATA)
- with patch.dict(
- current_app.config,
- {"UPLOAD_MAX_FILE_SIZE_BYTES": 100 * 1024 * 1024},
- ):
- df = reader.file_to_dataframe(file)
- assert len(df) == 3
-
-
def test_columnar_reader_metadata():
reader = ColumnarReader(
options=ColumnarReaderOptions(),
diff --git a/tests/unit_tests/commands/databases/upload_command_test.py b/tests/unit_tests/commands/databases/upload_command_test.py
new file mode 100644
index 00000000000..2268dc67db5
--- /dev/null
+++ b/tests/unit_tests/commands/databases/upload_command_test.py
@@ -0,0 +1,147 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+import io
+from unittest.mock import MagicMock
+
+import pytest
+from pytest_mock import MockerFixture
+from werkzeug.datastructures import FileStorage
+
+from superset.commands.database.exceptions import DatabaseUploadFileTooLarge
+from superset.commands.database.uploaders.base import UploadCommand
+
+
+def _file(contents: bytes) -> FileStorage:
+ return FileStorage(stream=io.BytesIO(contents), filename="data.bin")
+
+
+def test_file_size_bytes_does_not_consume_stream() -> None:
+ file = _file(b"abcdefghij") # 10 bytes
+ assert UploadCommand._file_size_bytes(file) == 10
+ # the stream is left at its original position so processing still works
+ assert file.stream.read() == b"abcdefghij"
+
+
+def _command(file: FileStorage) -> UploadCommand:
+ # the reader is not exercised by validate(); a stub is sufficient
+ return UploadCommand(
+ model_id=1,
+ table_name="t",
+ file=file,
+ schema=None,
+ reader=MagicMock(),
+ )
+
+
+def _stub_passing_checks(mocker: MockerFixture) -> None:
+ model = mocker.MagicMock()
+ model.db_engine_spec.supports_file_upload = True
+ mocker.patch(
+ "superset.commands.database.uploaders.base.DatabaseDAO.find_by_id",
+ return_value=model,
+ )
+ mocker.patch(
+ "superset.commands.database.uploaders.base.schema_allows_file_upload",
+ return_value=True,
+ )
+
+
+def test_validate_rejects_file_over_limit(
+ app_context: None, mocker: MockerFixture
+) -> None:
+ _stub_passing_checks(mocker)
+ mocker.patch.dict(
+ "superset.commands.database.uploaders.base.current_app.config",
+ {"UPLOAD_MAX_FILE_SIZE_BYTES": 4},
+ )
+ command = _command(_file(b"too many bytes"))
+ with pytest.raises(DatabaseUploadFileTooLarge):
+ command.validate()
+
+
+def test_validate_allows_file_within_limit(
+ app_context: None, mocker: MockerFixture
+) -> None:
+ _stub_passing_checks(mocker)
+ mocker.patch.dict(
+ "superset.commands.database.uploaders.base.current_app.config",
+ {"UPLOAD_MAX_FILE_SIZE_BYTES": 1024},
+ )
+ command = _command(_file(b"small"))
+ command.validate() # should not raise
+
+
+def test_validate_no_limit_when_disabled(
+ app_context: None, mocker: MockerFixture
+) -> None:
+ _stub_passing_checks(mocker)
+ mocker.patch.dict(
+ "superset.commands.database.uploaders.base.current_app.config",
+ {"UPLOAD_MAX_FILE_SIZE_BYTES": None},
+ )
+ command = _command(_file(b"x" * 10_000))
+ command.validate() # limit explicitly disabled (None) -> no rejection
+
+
+def test_validate_file_size_rejects_over_limit(
+ app_context: None, mocker: MockerFixture
+) -> None:
+ # the shared helper is used by both the upload and metadata paths
+ mocker.patch.dict(
+ "superset.commands.database.uploaders.base.current_app.config",
+ {"UPLOAD_MAX_FILE_SIZE_BYTES": 4},
+ )
+ with pytest.raises(DatabaseUploadFileTooLarge):
+ UploadCommand.validate_file_size(_file(b"too many bytes"))
+
+
+def test_validate_file_size_allows_within_limit(
+ app_context: None, mocker: MockerFixture
+) -> None:
+ mocker.patch.dict(
+ "superset.commands.database.uploaders.base.current_app.config",
+ {"UPLOAD_MAX_FILE_SIZE_BYTES": 1024},
+ )
+ UploadCommand.validate_file_size(_file(b"small")) # should not raise
+
+
+class _NonSeekableStream(io.RawIOBase):
+ def seekable(self) -> bool:
+ return False
+
+ def tell(self) -> int:
+ raise OSError("not seekable")
+
+
+def _non_seekable_file() -> FileStorage:
+ return FileStorage(stream=_NonSeekableStream(), filename="data.bin")
+
+
+def test_file_size_bytes_returns_none_when_not_seekable() -> None:
+ # a non-seekable stream raises on seek/tell; the size is unknown
+ assert UploadCommand._file_size_bytes(_non_seekable_file()) is None
+
+
+def test_validate_file_size_skips_when_not_seekable(
+ app_context: None, mocker: MockerFixture
+) -> None:
+ mocker.patch.dict(
+ "superset.commands.database.uploaders.base.current_app.config",
+ {"UPLOAD_MAX_FILE_SIZE_BYTES": 4},
+ )
+ # size can't be determined cheaply -> skip rather than raising a 500
+ UploadCommand.validate_file_size(_non_seekable_file())
diff --git a/tests/unit_tests/databases/api_test.py b/tests/unit_tests/databases/api_test.py
index f4eab5daf6b..63eb3f78f01 100644
--- a/tests/unit_tests/databases/api_test.py
+++ b/tests/unit_tests/databases/api_test.py
@@ -1858,6 +1858,43 @@ def test_columnar_metadata_validation(
assert response.json == {"message": {"file": ["Field may not be null."]}}
+def test_metadata_file_too_large(
+ mocker: MockerFixture, client: Any, full_api_access: None
+) -> None:
+ """
+ The metadata endpoint rejects an oversized file with a 413 before the
+ reader parses it, so the size limit cannot be bypassed by hitting
+ ``upload_metadata`` instead of ``upload``.
+ """
+ file_metadata = mocker.patch.object(CSVReader, "file_metadata")
+ mocker.patch.dict(current_app.config, {"UPLOAD_MAX_FILE_SIZE_BYTES": 4})
+ response = client.post(
+ "/api/v1/database/upload_metadata/",
+ data={"type": "csv", "file": create_csv_file()},
+ content_type="multipart/form-data",
+ )
+ assert response.status_code == 413
+ assert (
+ response.json["errors"][0]["message"]
+ == "Database upload file exceeds the maximum allowed size."
+ )
+ file_metadata.assert_not_called()
+
+
+def test_metadata_within_size_limit(
+ mocker: MockerFixture, client: Any, full_api_access: None
+) -> None:
+ """A file under ``UPLOAD_MAX_FILE_SIZE_BYTES`` passes the metadata endpoint."""
+ _ = mocker.patch.object(CSVReader, "file_metadata")
+ mocker.patch.dict(current_app.config, {"UPLOAD_MAX_FILE_SIZE_BYTES": 1024 * 1024})
+ response = client.post(
+ "/api/v1/database/upload_metadata/",
+ data={"type": "csv", "file": create_csv_file()},
+ content_type="multipart/form-data",
+ )
+ assert response.status_code == 200
+
+
def test_table_metadata_happy_path(
mocker: MockerFixture,
client: Any,