func jsonDataToArrow()

in go/adbc/driver/snowflake/record_reader.go [301:403]


func jsonDataToArrow(ctx context.Context, bldr *array.RecordBuilder, ld gosnowflake.ArrowStreamLoader) (arrow.Record, error) {
	rawData := ld.JSONData()
	fieldBuilders := bldr.Fields()
	for _, rec := range rawData {
		for i, col := range rec {
			field := fieldBuilders[i]

			if col == nil {
				field.AppendNull()
				continue
			}

			switch fb := field.(type) {
			case *array.Time64Builder:
				sec, nsec, err := extractTimestamp(col)
				if err != nil {
					return nil, err
				}

				fb.Append(arrow.Time64(sec*1e9 + nsec))
			case *array.TimestampBuilder:
				tz, err := fb.Type().(*arrow.TimestampType).GetZone()
				if err != nil {
					return nil, err
				}

				if tz != time.UTC {
					sec, nsec, err := extractTimestamp(col)
					if err != nil {
						return nil, err
					}
					val := time.Unix(sec, nsec).In(loc)
					ts, err := arrow.TimestampFromTime(val, arrow.Nanosecond)
					if err != nil {
						return nil, err
					}
					fb.Append(ts)
					break
				}

				snowflakeType, _ := bldr.Schema().Field(i).Metadata.GetValue("SNOWFLAKE_TYPE")
				if snowflakeType == "timestamp_ntz" {
					sec, nsec, err := extractTimestamp(col)
					if err != nil {
						return nil, err
					}

					fb.Append(arrow.Timestamp(sec*1e9 + nsec))
					break
				}

				// "timestamp_tz" should be value + offset separated by space
				tm := strings.Split(*col, " ")
				if len(tm) != 2 {
					return nil, adbc.Error{
						Msg:        "invalid TIMESTAMP_TZ data. value doesn't consist of two numeric values separated by a space: " + *col,
						SqlState:   [5]byte{'2', '2', '0', '0', '7'},
						VendorCode: 268000,
						Code:       adbc.StatusInvalidData,
					}
				}

				sec, nsec, err := extractTimestamp(&tm[0])
				if err != nil {
					return nil, err
				}
				offset, err := strconv.ParseInt(tm[1], 10, 64)
				if err != nil {
					return nil, adbc.Error{
						Msg:        "invalid TIMESTAMP_TZ data. offset value is not an integer: " + tm[1],
						SqlState:   [5]byte{'2', '2', '0', '0', '7'},
						VendorCode: 268000,
						Code:       adbc.StatusInvalidData,
					}
				}

				loc := gosnowflake.Location(int(offset) - 1440)
				tt := time.Unix(sec, nsec).In(loc)
				ts, err := arrow.TimestampFromTime(tt, arrow.Nanosecond)
				if err != nil {
					return nil, err
				}
				fb.Append(ts)
			case *array.BinaryBuilder:
				b, err := hex.DecodeString(*col)
				if err != nil {
					return nil, adbc.Error{
						Msg:        err.Error(),
						VendorCode: 268002,
						SqlState:   [5]byte{'2', '2', '0', '0', '3'},
						Code:       adbc.StatusInvalidData,
					}
				}
				fb.Append(b)
			default:
				if err := fb.AppendValueFromString(*col); err != nil {
					return nil, err
				}
			}
		}
	}
	return bldr.NewRecord(), nil
}