[Bug] REST catalog drop_table serializes purgeRequested as "True" instead of "true"
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 78/100
Piste de recherche
Commencez dans pyiceberg/catalog/rest/init.py, au niveau de RestCatalog.drop_table, et examinez les autres occurrences de params= suggérées dans l’issue. Reproduisez la requête ou exécutez les vérifications pertinentes du REST catalog, puis vérifiez que purgeRequested est sérialisé sous la forme true ou false en minuscules et que le serveur l’accepte.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Apache Iceberg version
None
Please describe the bug 🐞
### Description
`RestCatalog.drop_table()` passes a Python `bool` directly to `requests` query params. Python's `requests` library
serializes `True` as the string `"True"` (capitalized). This violates the OpenAPI 3.0 specification for boolean
query parameters and causes 400 errors on spec-compliant servers.
### Steps to Reproduce
```python
from pyiceberg.catalog import load_catalog
catalog = load_catalog("my_catalog", **{
"type": "rest",
"uri": "http://my-rest-catalog/iceberg",
...
})
catalog.drop_table("my_db.my_table", purge_requested=True)
# → 400 Bad Request
Evidence
Enabled wire-level logging via http.client.HTTPConnection.debuglevel = 1:
send: b'DELETE /iceberg/v1//namespaces/my_db/tables/my_table?purgeRequested=True HTTP/1.1\r\n...'
reply: 'HTTP/1.1 400 Bad Request\r\n'
header: x-amzn-errortype: purge_enabled
body: {"error":{"type":"BadRequestException","message":"purge_enabled: DropTable operation failed. OSS Tables only
supports dropping tables with purge enabled."}}
The server receives purgeRequested=True (capital T) and does not interpret it as boolean true.
Root Cause
pyiceberg/catalog/rest/init.py, drop_table method (~line 1135):
def drop_table(self, identifier: str | Identifier, purge_requested: bool = False) -> None:
response = self._session.delete(
self.url(Endpoints.drop_table, prefixed=True, **self._split_identifier_for_path(identifier)),
params={"purgeRequested": purge_requested}, # Python bool True → requests serializes as "True"
)
Python's requests library calls str() on param values: str(True) → "True".
Why This Is a Bug
The Iceberg REST catalog OpenAPI spec (rest-catalog-open-api.yaml
(https://github.com/apache/iceberg/blob/main/open-api/rest-catalog-open-api.yaml)) defines purgeRequested as:
- name: purgeRequested
in: query
schema:
type: boolean
Per the specification chain:
- OpenAPI 3.0.3, Parameter Object (https://spec.openapis.org/oas/v3.0.3#parameter-object): query parameters default
to style: form; primitive types are based on "JSON Schema Specification Wright Draft 00" - JSON Schema Wright Draft 00, Section 4.1
(https://datatracker.ietf.org/doc/html/draft-wright-json-schema-validation-00#section-4.1): type: boolean accepts
only JSON boolean literals - RFC 7159 (The JSON Data Interchange Format), Section 3 (https://datatracker.ietf.org/doc/html/rfc7159#section-3):
the only boolean literals are true and false (lowercase)
"True" (capitalized) is not a valid serialization of a JSON boolean.
Suggested Fix
params={"purgeRequested": str(purge_requested).lower()},
Or more explicitly:
params={"purgeRequested": "true" if purge_requested else "false"},
Scope
This pattern may exist elsewhere in the REST catalog client. A grep for params={ in
pyiceberg/catalog/rest/init.py would identify other occurrences where Python bools are passed as query
parameters.
Environment
- PyIceberg: 0.11.1
- Python: 3.10.21
- Server: Aliyun OSS Tables (Iceberg REST compatible, strictly validates boolean query params)
- requests: 2.x (serializes bool via str())
Willingness to contribute
- I can contribute a fix for this bug independently
- I would be willing to contribute a fix for this bug with guidance from the Iceberg community
- I cannot contribute a fix for this bug at this time
- Langage dominant
- Python
- Étoiles
- 1.1k
- Forks
- 589
- Merge moyen
- 2 j 4 h
- PR mergées (30 j)
- 72
Guide de contribution
Aucun guide de contribution indexé pour ce dépôt
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de apache/iceberg-python
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
apache/iceberg-python#3996 ·
-
Deletion vector bitmap count is read from the blob and used as a loop bound without validation Ouvertebug
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
apache/iceberg-python#3979 ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
apache/iceberg-python#3885 ·
-
[Bug] PyArrowFileIO fails to propagate s3.ssl.ca-cert to pyarrow.fs.S3FileSystem tls_ca_file_path Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
apache/iceberg-python#3866 · 1 commentaire ·
-
Cannot connect to a Hive Metastore with Kerberos when the principal's host differs from the URI host Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
apache/iceberg-python#3787 ·
Toutes les issues de apache/iceberg-python
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
-
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
-
enhancement
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
-
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100