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

Function decodeToArrow

pgserver/logrepl/decode.go:30–304  ·  view source on GitHub ↗

decodeToArrow decodes Postgres text format data and appends directly to Arrow builder

(typeMap *pgtype.Map, columnType *pglogrepl.RelationMessageColumn, data []byte, format int16, builder array.Builder)

Source from the content-addressed store, hash-verified

28
29// decodeToArrow decodes Postgres text format data and appends directly to Arrow builder
30func decodeToArrow(typeMap *pgtype.Map, columnType *pglogrepl.RelationMessageColumn, data []byte, format int16, builder array.Builder) (int, error) {
31 if data == nil {
32 builder.AppendNull()
33 return 0, nil
34 }
35
36 dt, ok := typeMap.TypeForOID(columnType.DataType)
37 if !ok {
38 // Unknown type, store as string if possible
39 if b, ok := builder.(*array.StringBuilder); ok && format == pgtype.TextFormatCode {
40 b.BinaryBuilder.Append(data)
41 return len(data), nil
42 }
43 return 0, fmt.Errorf("column %s: unsupported type conversion for OID %d to %T", columnType.Name, columnType.DataType, builder)
44 }
45
46 var (
47 oid = dt.OID
48 scale int32
49 )
50 switch oid {
51 case pgtype.NumericOID, pgtype.NumericArrayOID:
52 _, scale, _ = pgtypes.DecodePrecisionScale(int(columnType.TypeModifier))
53 }
54
55 if ac, ok := dt.Codec.(*pgtype.ArrayCodec); ok {
56 if builder, ok := builder.(*array.ListBuilder); ok {
57 return decodeArrayToArrow(typeMap, ac, data, format, scale, builder)
58 }
59 return 0, fmt.Errorf("column %s: unexpected Arrow array builder %T for Postgres array", columnType.Name, builder)
60 }
61
62 // StringBuilder.Append is just StringBuilder.BinaryBuilder.Append
63 if b, ok := builder.(*array.StringBuilder); ok {
64 builder = b.BinaryBuilder
65 }
66
67 // TODO(fan): add dedicated decoder for missing types
68 switch oid {
69 case pgtype.BoolOID:
70 if b, ok := builder.(*array.BooleanBuilder); ok {
71 var v bool
72 var codec pgtype.BoolCodec
73 if err := codec.PlanScan(typeMap, oid, format, &v).Scan(data, &v); err != nil {
74 return 0, err
75 }
76 b.Append(v)
77 return 1, nil
78 }
79
80 case pgtype.QCharOID:
81 if b, ok := builder.(*array.Uint8Builder); ok {
82 var v byte
83 var codec pgtype.QCharCodec
84 if err := codec.PlanScan(typeMap, oid, format, &v).Scan(data, &v); err != nil {
85 return 0, err
86 }
87 b.Append(v)

Callers 1

appendMethod · 0.85

Calls 5

DecodePrecisionScaleFunction · 0.92
decodeArrayToArrowFunction · 0.85
writeValueFunction · 0.85
AppendMethod · 0.80
EncodeMethod · 0.45

Tested by

no test coverage detected