OData default serializers: Edm.TimeOfDay rejects seconds in (59, 60), Edm.Decimal loses fractional digits or uses exponential notation
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 65/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Stack tecnologico
- typescript
- Ambito
- api
Direzione di ricerca
Start with the three named spots: validateTime in packages/odata-v4/src/de-serializers/converters.ts (the seconds check), the Edm.Decimal branch in packages/odata-v4/src/de-serializers/default-de-serializers.ts, and serializeFromBigNumber in packages/odata-common/src/de-serializers/payload-value-converter.ts. Run the repro script from the issue to see the current output. Done means the three expected values in the issue are returned and the existing odata-v4 and odata-v2 serializer tests still pass.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Describe the Bug
There are three serialization bugs in the default OData de-serializers:
- OData v4
Edm.TimeOfDayrejects fractional seconds in(59, 60):deserializeToTime('23:59:59.5')returns{ hours: 23, minutes: 59, seconds: 59.5 }, but passing that object back toserializeToTimethrowsProvided time value [object Object] can not be serialized to a valid Edm.TimeOfDay. Any entity read from a service whoseEdm.TimeOfDayfalls in the last second of a minute with fractional seconds cannot be serialized back in a request payload, key, or filter. - OData v4
Edm.Decimalsilently truncates fractional digits to IEEE-754 double precision:defaultDeSerializers['Edm.Decimal'].serializeconverts theBigNumberwithvalue.toNumber()and returns thenumberwhenever it lies betweenNumber.MIN_SAFE_INTEGERandNumber.MAX_SAFE_INTEGER. That bounds check only protects large integers; a decimal with more than ~16 significant digits (such as'1234567.123456789012') is inside the safe-integer range and loses its trailing digits (1234567.123456789) in both payloads and URIs. - OData v2 and v4
Edm.Decimalformat small and large numbers in exponential notation:serializeFromBigNumbercallsvalue.toString(), which switches to exponential notation at<= 1e-7and>= 1e+21. For example,'0.00000001'serializes in v2 as'1e-8'in payloads and'1e-8M'in URIs (which is not a valid OData v2 decimal literal), and'1000000000000000000000'serializes as'1e+21'in both v2 and v4.
Steps to Reproduce
- Install
@sap-cloud-sdk/[email protected]and@sap-cloud-sdk/[email protected]. - Run
node repro.jswith the script in Code Examples below.
Expected Behavior
v4['Edm.TimeOfDay'].serialize(v4['Edm.TimeOfDay'].deserialize('23:59:59.5'))returns'23:59:59.5'.v4['Edm.Decimal'].serialize(v4['Edm.Decimal'].deserialize('1234567.123456789012'))preserves all digits ('1234567.123456789012').Edm.Decimalserialization produces plain decimal strings without exponential notation ('0.00000001','0.00000001M','1000000000000000000000').
Screenshots
No response
Used Versions
- Node version via
node -v: v26.13.0 (also reproduced on v24.22.2) - NPM version via
npm -v: 11.20.0 - SAP Cloud SDK version:
@sap-cloud-sdk/[email protected],@sap-cloud-sdk/[email protected](andmainat76cfd545) - For CAP users, CAP version: N/A
Code Examples
const { defaultDeSerializers: v4 } = require('@sap-cloud-sdk/odata-v4');
const { defaultDeSerializers: v2 } = require('@sap-cloud-sdk/odata-v2');
// 1. v4 Edm.TimeOfDay with seconds in (59, 60)
const tod = v4['Edm.TimeOfDay'];
console.log(tod.serialize(tod.deserialize('10:15:58.999'))); // '10:15:58.999'
try {
console.log(tod.serialize(tod.deserialize('23:59:59.5')));
} catch (e) {
console.log(e.message);
// Provided time value [object Object] can not be serialized to a valid Edm.TimeOfDay
}
// 2. v4 Edm.Decimal precision loss
const dec4 = v4['Edm.Decimal'];
console.log(dec4.serialize(dec4.deserialize('1234567.123456789012'))); // 1234567.123456789
console.log(dec4.serialize(dec4.deserialize('0.1234567890123456789'))); // 0.12345678901234568
console.log(dec4.serializeToUri(dec4.deserialize('1234567.123456789012'), dec4.serialize)); // '1234567.123456789'
// 3. v2 / v4 Edm.Decimal exponential notation
const dec2 = v2['Edm.Decimal'];
console.log(dec2.serialize(dec2.deserialize('0.00000001'))); // '1e-8'
console.log(dec2.serializeToUri(dec2.deserialize('0.00000001'), dec2.serialize)); // '1e-8M'
console.log(dec2.serialize(dec2.deserialize('1000000000000000000000'))); // '1e+21'
console.log(dec4.serialize(dec4.deserialize('1000000000000000000000'))); // '1e+21'
Log File
Error: Provided time value [object Object] can not be serialized to a valid Edm.TimeOfDay
Affected Development Phase
Development
Impact
Impaired
Timeline
No response
Additional Context
- In
packages/odata-v4/src/de-serializers/converters.ts,validateTimechecksseconds > 59; because fractional seconds are stored insecondsas a float, this should beseconds >= 60. - In
packages/odata-v4/src/de-serializers/default-de-serializers.ts,Edm.Decimalonly checksMIN_SAFE_INTEGER <= primitiveNumber <= MAX_SAFE_INTEGERbefore returningvalue.toNumber(), which does not check whethernew BigNumber(primitiveNumber).isEqualTo(value). - In
packages/odata-common/src/de-serializers/payload-value-converter.ts,serializeFromBigNumbercallsvalue.toString()instead ofvalue.toFixed().
Credit: https://ucsbplse.github.io/
- Lingua principale
- TypeScript
- Stelle
- 221
- Fork
- 79
- Merge medio
- 13h 27m
- PR unite (30g)
- 22
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di SAP/cloud-sdk-js
-
OData v2: Edm.Time with fractional seconds is parsed with seconds set to 0Forse già presa @sebxt l’ha presa 8 giorni fa. Apertabug
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
SAP/cloud-sdk-js#7043 · 1 commento · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
-
OData v2: Edm.DateTime and Edm.DateTimeOffset payload serialization drops millisecondsForse già presa @sebxt l’ha presa 9 giorni fa. Apertabug
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
SAP/cloud-sdk-js#7035 · 1 commento · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
-
feature request tok:pd5
Difficoltà 3/5 1-2 giorni Idoneità per principianti 62/100
SAP/cloud-sdk-js#7058 ·
I maintainer di solito rispondono entro 1 giorno
-
tok:pd5
Difficoltà 3/5 1-2 giorni Idoneità per principianti 55/100
SAP/cloud-sdk-js#7047 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
OpenAPI generator: Operations with multiple request body representations are dropped to single oneForse già presa @davidkna-sap l’ha presa 25 giorni fa. Apertabug
Difficoltà 4/5 3-5 giorni Idoneità per principianti 30/100
SAP/cloud-sdk-js#7039 · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di SAP/cloud-sdk-js
Issue simili
-
area:docs documentation good first issue
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
I maintainer di solito rispondono entro 12 giorni
-
area:docs good first issue
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
thainanluiz/TSSuper#30 ·
-
[analytics-core] getQueryParams does not decode `+` as space and truncates values containing `=`Apertabug
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
amplitude/Amplitude-TypeScript#2179 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni
-
ci good first issue severity: low
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
TMHSDigital/GH-Arcade#111 ·