dsinterval multiply/divide silently wraps day count past int32 (dead overflow check)

Ouverte
#2,954 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

@123123213weqw y travaille déjà.

Depuis le 28/10/2026.

  • #2958 par @123123213weqw — fermée sans fusion
  • #2961 par @123123213weqw — ouverte

Évaluation

Difficulté
2/5
Temps estimé
1-3 heures
Accessibilité débutants
25/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
À l'abandon
Stack technique
c, postgresql
Domaine
backend, databases

Piste de recherche

Read contrib/ivorysql_ora/src/datatype/dsinterval.c, focusing on dsinterval_mul() and dsinterval_div() and the day-folding overflow checks. Reproduce the supplied SQL cases and inspect nearby checks for the expected error behavior. Done means both cases return ERROR: interval out of range; pull requests #2958 and #2961 show that work is already underway.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

Environment

  • IvorySQL 5.6 (official deb) + ivorysql_ora extension built from current master (2c5e8dd)
  • ivorysql.compatible_mode = oracle

Reproduction

SELECT interval '21 23:59:59.999999' day to second * 102261126;
-- +0-0 -2045222525 +23:58:17.739264000   (negative day count!)

SELECT interval '21 23:59:59.999999' day to second / 0.00000001;
-- +0-0 -2094967297 +23:58:20.000256000

Root cause

In contrib/ivorysql_ora/src/datatype/dsinterval.c, both dsinterval_mul() and dsinterval_div() fold whole days out of the time field with:

result->day += result->time / USECS_PER_DAY;
if (result->day > INT_MAX || result->day < INT_MIN)   /* dead code */

result->day is int32; by the time the comparison runs, the += has already converted the int64 sum to int32 and wrapped, so the check can never fire. In the examples above, day * factor fits int32 and time * factor fits int64 individually, but their sum (~2.25e9 days) does not.

Expected

ERROR: interval out of range (matching the checks that guard the day/time products earlier in the same functions).

Langage dominant
C
Étoiles
1.1k
Forks
232
Merge moyen
2 j 3 h
PR mergées (30 j)
8

Préparer son environnement

Ce projet ne fournit ni conteneur de développement, ni Dockerfile, ni guide de contribution : l'installation est à votre charge. Commencez par son README, et consultez notre guide de la première contribution pour les étapes générales.

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de IvorySQL/IvorySQL

Toutes les issues de IvorySQL/IvorySQL

Issues similaires

Plus d'issues C

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.