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,