apache / apache/iceberg-python

[Bug] REST catalog drop_table serializes purgeRequested as "True" instead of "true"

Open Beginner friendly
#3,836 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
Python
Stars
1.1k
Forks
581
Avg merge
1d 17h
Merged PRs (30d)
78

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

- [x] 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

Contributor guide

No contributing guide indexed for this repository

Research direction

Start in pyiceberg/catalog/rest/__init__.py at RestCatalog.drop_table and inspect the other params= occurrences suggested in the issue. Reproduce the request or run the relevant REST catalog checks, then verify that purgeRequested is serialized as lowercase true or false and that the server accepts it.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
api
Issue type
Bug
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Active
Clarity
Clearly specified
Newbie friendliness
78/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.