MCPcopy Create free account
hub / github.com/auxten/postgresql-parser / decodeDecimal

Function decodeDecimal

pkg/util/encoding/decimal.go:258–323  ·  view source on GitHub ↗
(buf []byte, tmp []byte, invert bool)

Source from the content-addressed store, hash-verified

256}
257
258func decodeDecimal(buf []byte, tmp []byte, invert bool) ([]byte, apd.Decimal, error) {
259 // Handle the simplistic cases first.
260 switch buf[0] {
261 case decimalNaN, decimalNaNDesc:
262 return buf[1:], apd.Decimal{Form: apd.NaN}, nil
263 case decimalInfinity:
264 return buf[1:], apd.Decimal{Form: apd.Infinite, Negative: invert}, nil
265 case decimalNegativeInfinity:
266 return buf[1:], apd.Decimal{Form: apd.Infinite, Negative: !invert}, nil
267 case decimalZero:
268 return buf[1:], apd.Decimal{}, nil
269 }
270 tmp = tmp[len(tmp):cap(tmp)]
271 switch {
272 case buf[0] == decimalNegLarge:
273 // Negative large.
274 e, m, r, tmp2, err := decodeLargeNumber(true, buf, tmp)
275 if err != nil {
276 return nil, apd.Decimal{}, err
277 }
278 d, err := makeDecimalFromMandE(!invert, e, m, tmp2)
279 return r, d, err
280 case buf[0] > decimalNegLarge && buf[0] <= decimalNegMedium:
281 // Negative medium.
282 e, m, r, tmp2, err := decodeMediumNumber(true, buf, tmp)
283 if err != nil {
284 return nil, apd.Decimal{}, err
285 }
286 d, err := makeDecimalFromMandE(!invert, e, m, tmp2)
287 return r, d, err
288 case buf[0] == decimalNegSmall:
289 // Negative small.
290 e, m, r, tmp2, err := decodeSmallNumber(true, buf, tmp)
291 if err != nil {
292 return nil, apd.Decimal{}, err
293 }
294 d, err := makeDecimalFromMandE(!invert, e, m, tmp2)
295 return r, d, err
296 case buf[0] == decimalPosLarge:
297 // Positive large.
298 e, m, r, tmp2, err := decodeLargeNumber(false, buf, tmp)
299 if err != nil {
300 return nil, apd.Decimal{}, err
301 }
302 d, err := makeDecimalFromMandE(invert, e, m, tmp2)
303 return r, d, err
304 case buf[0] >= decimalPosMedium && buf[0] < decimalPosLarge:
305 // Positive medium.
306 e, m, r, tmp2, err := decodeMediumNumber(false, buf, tmp)
307 if err != nil {
308 return nil, apd.Decimal{}, err
309 }
310 d, err := makeDecimalFromMandE(invert, e, m, tmp2)
311 return r, d, err
312 case buf[0] == decimalPosSmall:
313 // Positive small.
314 e, m, r, tmp2, err := decodeSmallNumber(false, buf, tmp)
315 if err != nil {

Callers 2

DecodeDecimalAscendingFunction · 0.85
DecodeDecimalDescendingFunction · 0.85

Calls 4

decodeLargeNumberFunction · 0.85
makeDecimalFromMandEFunction · 0.85
decodeMediumNumberFunction · 0.85
decodeSmallNumberFunction · 0.85

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…