@@ -281,11 +281,15 @@ func (h *DoltgresHandler) convertBindParameters(ctx *sql.Context, types []uint32
281281 if ! ok {
282282 return nil , errors .Errorf ("unhandled oid type: %v" , types [i ])
283283 }
284- v , err := pgTyp .IoInput (ctx , bindVarString )
285- if err != nil {
286- return nil , err
284+ if bindVarString == nil {
285+ bindings [fmt .Sprintf ("v%d" , i + 1 )] = sqlparser.InjectedExpr {Expression : pgexprs .NewUnsafeLiteral (nil , pgTyp )}
286+ } else {
287+ v , err := pgTyp .IoInput (ctx , * bindVarString )
288+ if err != nil {
289+ return nil , err
290+ }
291+ bindings [fmt .Sprintf ("v%d" , i + 1 )] = sqlparser.InjectedExpr {Expression : pgexprs .NewUnsafeLiteral (v , pgTyp )}
287292 }
288- bindings [fmt .Sprintf ("v%d" , i + 1 )] = sqlparser.InjectedExpr {Expression : pgexprs .NewUnsafeLiteral (v , pgTyp )}
289293 }
290294 return bindings , nil
291295}
@@ -299,50 +303,75 @@ func (h *DoltgresHandler) convertBindParameters(ctx *sql.Context, types []uint32
299303// This function relies on the pgtype library to decode values, in text and binary formats,
300304// however, a few types cannot be scanned directly into strings from the binary format by this
301305// library, so there is special handling for them.
302- func (h * DoltgresHandler ) convertBindParameterToString (typ uint32 , value []byte , formatCode int16 ) (bindVarString string , err error ) {
306+ func (h * DoltgresHandler ) convertBindParameterToString (typ uint32 , value []byte , formatCode int16 ) (bindVarString * string , err error ) {
303307 isBinaryFormat := formatCode == pgtype .BinaryFormatCode
304308
305309 switch {
306310 case (typ == pgtype .TimestampOID || typ == pgtype .TimestamptzOID ) && isBinaryFormat :
307- var t time.Time
311+ var t * time.Time
308312 if err := h .pgTypeMap .Scan (typ , formatCode , value , & t ); err != nil {
309- return "" , err
313+ return nil , err
314+ }
315+ if t != nil {
316+ format := t .Format ("2006-01-02 15:04:05" )
317+ bindVarString = & format
310318 }
311- bindVarString = t .Format ("2006-01-02 15:04:05" )
312319 case typ == pgtype .DateOID && isBinaryFormat :
313- var d pgtype.Date
320+ var d * pgtype.Date
314321 if err := h .pgTypeMap .Scan (typ , formatCode , value , & d ); err != nil {
315- return "" , err
322+ return nil , err
323+ }
324+ if d != nil {
325+ format := d .Time .Format ("2006-01-02" )
326+ bindVarString = & format
316327 }
317- bindVarString = d .Time .Format ("2006-01-02" )
318328 case typ == pgtype .BoolOID && isBinaryFormat :
319- var b bool
329+ var b * bool
320330 if err := h .pgTypeMap .Scan (typ , formatCode , value , & b ); err != nil {
321- return "" , err
331+ return nil , err
322332 }
323- if b {
324- bindVarString = "true"
325- } else {
326- bindVarString = "false"
333+ if b != nil {
334+ if * b {
335+ var t = "true"
336+ bindVarString = & t
337+ } else {
338+ var f = "false"
339+ bindVarString = & f
340+ }
327341 }
328342 case typ == pgtype .ByteaOID && isBinaryFormat :
329- bindVarString = `\x` + hex .EncodeToString (value )
343+ if value != nil {
344+ s := `\x` + hex .EncodeToString (value )
345+ bindVarString = & s
346+ }
330347 case typ == pgtype .Int2OID && isBinaryFormat :
331- bindVarString = strconv .FormatInt (int64 (binary .BigEndian .Uint16 (value )), 10 )
348+ if value != nil {
349+ formatInt := strconv .FormatInt (int64 (binary .BigEndian .Uint16 (value )), 10 )
350+ bindVarString = & formatInt
351+ }
332352 case typ == pgtype .Int4OID && isBinaryFormat :
333- bindVarString = strconv .FormatInt (int64 (binary .BigEndian .Uint32 (value )), 10 )
353+ if value != nil {
354+ formatInt := strconv .FormatInt (int64 (binary .BigEndian .Uint32 (value )), 10 )
355+ bindVarString = & formatInt
356+ }
334357 case typ == pgtype .Int8OID && isBinaryFormat :
335- bindVarString = strconv .FormatInt (int64 (binary .BigEndian .Uint64 (value )), 10 )
358+ if value != nil {
359+ formatInt := strconv .FormatInt (int64 (binary .BigEndian .Uint64 (value )), 10 )
360+ bindVarString = & formatInt
361+ }
336362 case typ == pgtype .UUIDOID && isBinaryFormat :
337- u , err := uuid .FromBytes (value )
338- if err != nil {
339- return "" , err
363+ if value != nil {
364+ u , err := uuid .FromBytes (value )
365+ if err != nil {
366+ return nil , err
367+ }
368+ s := u .String ()
369+ bindVarString = & s
340370 }
341- bindVarString = u .String ()
342371 default :
343372 // For text format or types that can handle binary-to-string conversion
344373 if err := h .pgTypeMap .Scan (typ , formatCode , value , & bindVarString ); err != nil {
345- return "" , err
374+ return nil , err
346375 }
347376 }
348377
0 commit comments