appendArrayElement appends rv to the buffer, returning the extended buffer and the delimiter to use before the next element. When rv's Kind is neither reflect.Array nor reflect.Slice, it is converted using driver.DefaultParameterConverter and the resulting []byte or string is double-quoted. See ht
(b []byte, rv reflect.Value)
| 1111 | // |
| 1112 | // See http://www.postgresql.org/docs/current/static/arrays.html#ARRAYS-IO |
| 1113 | func appendArrayElement(b []byte, rv reflect.Value) ([]byte, string, error) { |
| 1114 | if k := rv.Kind(); k == reflect.Array || k == reflect.Slice { |
| 1115 | if t := rv.Type(); t != typeByteSlice && !t.Implements(typeDriverValuer) { |
| 1116 | if n := rv.Len(); n > 0 { |
| 1117 | return appendArray(b, rv, n) |
| 1118 | } |
| 1119 | |
| 1120 | return b, "", nil |
| 1121 | } |
| 1122 | } |
| 1123 | |
| 1124 | var del = "," |
| 1125 | var err error |
| 1126 | var iv any = rv.Interface() |
| 1127 | |
| 1128 | if ad, ok := iv.(ArrayDelimiter); ok { |
| 1129 | del = ad.ArrayDelimiter() |
| 1130 | } |
| 1131 | |
| 1132 | if iv, err = driver.DefaultParameterConverter.ConvertValue(iv); err != nil { |
| 1133 | return b, del, err |
| 1134 | } |
| 1135 | |
| 1136 | switch v := iv.(type) { |
| 1137 | case nil: |
| 1138 | return append(b, "NULL"...), del, nil |
| 1139 | case []byte: |
| 1140 | return appendArrayQuotedBytes(b, v), del, nil |
| 1141 | case string: |
| 1142 | return appendArrayQuotedBytes(b, []byte(v)), del, nil |
| 1143 | } |
| 1144 | |
| 1145 | b, err = appendValue(b, iv) |
| 1146 | return b, del, err |
| 1147 | } |
| 1148 | |
| 1149 | func appendArrayQuotedBytes(b, v []byte) []byte { |
| 1150 | b = append(b, '"') |
no test coverage detected
searching dependent graphs…