MCPcopy Create free account
hub / github.com/apecloud/myduckserver / decodeArrayToArrow

Function decodeArrayToArrow

pgserver/logrepl/decode.go:307–585  ·  view source on GitHub ↗

decodeArrayToArrow decodes Postgres array data and appends directly to Arrow builder

(typeMap *pgtype.Map, ac *pgtype.ArrayCodec, data []byte, format int16, scale int32, builder *array.ListBuilder)

Source from the content-addressed store, hash-verified

305
306// decodeArrayToArrow decodes Postgres array data and appends directly to Arrow builder
307func decodeArrayToArrow(typeMap *pgtype.Map, ac *pgtype.ArrayCodec, data []byte, format int16, scale int32, builder *array.ListBuilder) (int, error) {
308 if data == nil {
309 builder.AppendNull()
310 return 0, nil
311 }
312
313 // This must be called before (NOT after!) appending elements to the value builder
314 builder.Append(true)
315
316 var (
317 et = ac.ElementType
318 oid = et.OID
319 values = builder.ValueBuilder()
320 )
321
322 // StringBuilder.Append is just StringBuilder.BinaryBuilder.Append
323 if b, ok := values.(*array.StringBuilder); ok {
324 values = b.BinaryBuilder
325 }
326
327 // Heap allocations are unavoidable if we stick to ArrayCodec,
328 // but it should not be a bottleneck here.
329 switch oid {
330 case pgtype.BoolOID:
331 if values, ok := values.(*array.BooleanBuilder); ok {
332 var v pgtype.FlatArray[pgtype.Bool]
333 if err := ac.PlanScan(typeMap, oid, format, &v).Scan(data, &v); err != nil {
334 return 0, err
335 }
336 for _, e := range v {
337 if e.Valid {
338 values.Append(e.Bool)
339 } else {
340 values.AppendNull()
341 }
342 }
343 return len(v) * 1, nil
344 }
345
346 case pgtype.Int2OID:
347 if values, ok := values.(*array.Int16Builder); ok {
348 var v pgtype.FlatArray[pgtype.Int2]
349 if err := ac.PlanScan(typeMap, oid, format, &v).Scan(data, &v); err != nil {
350 return 0, err
351 }
352 for _, e := range v {
353 if e.Valid {
354 values.Append(e.Int16)
355 } else {
356 values.AppendNull()
357 }
358 }
359 return len(v) * 2, nil
360 }
361
362 case pgtype.Int4OID:
363 if values, ok := values.(*array.Int32Builder); ok {
364 var v pgtype.FlatArray[pgtype.Int4]

Callers 1

decodeToArrowFunction · 0.85

Calls 2

AppendMethod · 0.80
EncodeMethod · 0.45

Tested by

no test coverage detected