code: func (b *builtinInsertBinarySig) evalString(row chunk.Row) (string, bool, error) {
  	str, isNull, err := b.args[0].EvalString(b.ctx, row)
  	if isNull || err != nil {
  		return "", true, err
  	}
  	strLength := int64(len(str))
  
  	pos, isNull, err := b.args[1].EvalInt(b.ctx, row)
  	if isNull || err != nil {
  		return "", true, err
  	}
  	if pos < 1 || pos > strLength {
  		return str, false, nil
  	}
  
  	length, isNull, err := b.args[2].EvalInt(b.ctx, row)
  	if isNull || err != nil {
  		return "", true, err
  	}
  
  	newstr, isNull, err := b.args[3].EvalString(b.ctx, row)
  	if isNull || err != nil {
  		return "", true, err
  	}
  
  	if length > strLength-pos+1 || length < 0 {
  		length = strLength - pos + 1
  	}
  
  	if uint64(strLength-length+int64(len(newstr))) > b.maxAllowedPacket {
  		b.ctx.GetSessionVars().StmtCtx.AppendWarning(errWarnAllowedPacketOverflowed.GenWithStackByArgs("insert", b.maxAllowedPacket))
  		return "", true, nil
  	}
  
  	return str[0:pos-1] + newstr + str[pos+length-1:], false, nil
  }
docs: // evalString evals INSERT(str,pos,len,newstr).
  // See https://dev.mysql.com/doc/refman/5.6/en/string-functions.html#function_insert