StringLiteral to IntegerType/LongType silently truncates fractional strings, changing predicate meaning
Les mainteneurs répondent en général sous 1 jour
@Shahzeb-DataEngineer y travaille déjà.
Depuis le 15/11/2026.
- #4383 par @Shahzeb-DataEngineer — ouverte
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 68/100
Piste de recherche
Le bogue se situe dans la conversion StringLiteral.to() pour IntegerType et LongType, dans pyiceberg/expressions/literals.py. Elle devrait passer par l'helper existant _to_integral que DecimalLiteral utilise déjà. Commence par reproduire literal("2.6").to(IntegerType()), puis lis test_string_literal dans tests/expressions/test_literals.py. C'est terminé lorsque les chaînes fractionnaires lèvent ValueError pour les deux types entiers, et que les chaînes entières comme "2.0" et "1e3" se convertissent toujours exactement.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Apache Iceberg version
0.12.0 (latest release)
Please describe the bug 🐞
literal("2.6").to(IntegerType()) returns LongLiteral(2) instead of raising, while DecimalLiteral(Decimal("2.6")).to(IntegerType()) raises ValueError. A bound predicate such as x < "2.6" on an int column therefore becomes x < 2 and wrongly drops rows with x = 2 (verified with expression_evaluator); the same bound literal feeds partition pruning, so files can be skipped too.
The sibling DecimalLiteral.to(IntegerType/LongType) already rejects fractional values via the existing _to_integral helper, with a test spelling out why: rounding would change the predicate (e.g. x > 2.6 becoming x > 3 drops x = 3). The StringLiteral path was missed. The reference Java implementation has no INTEGER/LONG case in StringLiteral.to() and refuses the conversion.
Suggested fix: use the existing _to_integral helper in both StringLiteral.to(IntegerType) and StringLiteral.to(LongType), and update test_string_literal to expect ValueError for fractional strings.
Reproduction (pyiceberg 0.12.0, main @ fce8185):
literal("2.6").to(IntegerType())returnsLongLiteral(2); same for LongTypeliteral("-2.5").to(IntegerType())returnsLongLiteral(-2);literal("0.1").to(LongType())returnsLongLiteral(0)LessThan("x", "2.6")bound to an int column becomesx < 2, andexpression_evaluatorreturns False for a row with x = 2, although x < 2.6 is True- Integral strings still convert exactly:
literal("2.0").to(IntegerType())returns 2,literal("1e3").to(IntegerType())returns 1000
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.2k
- Forks
- 664
- Merge moyen
- 2 j 10 h
- PR mergées (30 j)
- 131
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Aucun guide de contribution
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
-
`inspect.files()` and the other file metadata tables raise `ArrowInvalid` when a snapshot has no manifestsPeut-être pris @YuangGao l’a pris il y a 12 jours. Ouvertekind:bug
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
apache/iceberg-python#4269 ·
Les mainteneurs répondent en général sous 1 jour
-
`inspect.entries()` raises TypeError when a data file has no column_sizesPeut-être pris @Rahul-cs50 l’a pris il y a 16 jours. Ouvertekind:bug
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
apache/iceberg-python#4186 · 2 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
`older_than` reads a naive datetime as UTC and expires snapshots it should keepPeut-être pris @Rahul-cs50 l’a pris il y a 14 jours. Ouvertekind:bug
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
apache/iceberg-python#4182 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
REST: Send empty first-page pageToken when rest-page-size is setPeut-être pris @ehddnr301 l’a pris il y a 33 jours. Ouvertekind:bug
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
apache/iceberg-python#4096 ·
Les mainteneurs répondent en général sous 1 jour
-
PyArrowFileIO: every small S3 write is a 3-request multipart upload; expose allow_delayed_openPeut-être pris @David-Banquet l’a pris il y a 30 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
apache/iceberg-python#4093 · 3 commentaires ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de apache/iceberg-python
Issues similaires
-
ライブラリを追加Ouvertepriority middle
Difficulté 1/5 Moins d'une heure Accessibilité débutants 62/100
KATO-Hiro/AtCoderClans#13015 ·
Les mainteneurs répondent en général sous 1 jour
-
request-theme
Difficulté 2/5 Moins d'une heure Accessibilité débutants 62/100
LizardByte/ThemerrDB#10024 · 2 commentaires ·
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 72/100
btclib-org/btclib-node#2505 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
open-webui/open-webui#34462 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
KLayout/klayout#2554 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour