|
15 | 15 | package function |
16 | 16 |
|
17 | 17 | import ( |
| 18 | + "bytes" |
18 | 19 | "encoding/hex" |
19 | 20 | "fmt" |
20 | 21 | "math" |
@@ -632,19 +633,32 @@ func (q *Quote) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { |
632 | 633 | return nil, err |
633 | 634 | } |
634 | 635 |
|
635 | | - val, _, err := types.Text.Convert(ctx, arg) |
| 636 | + val, _, err := types.Blob.Convert(ctx, arg) |
636 | 637 | if err != nil { |
637 | 638 | return nil, err |
638 | 639 | } |
639 | 640 | if val == nil { |
640 | 641 | return nil, nil |
641 | 642 | } |
642 | | - valStr := val.(string) |
643 | | - valStr = strings.Replace(valStr, "\\", "\\\\", -1) |
644 | | - valStr = strings.Replace(valStr, "'", "\\'", -1) |
645 | | - valStr = strings.Replace(valStr, "\000", "\\0", -1) |
646 | | - valStr = strings.Replace(valStr, "\032", "\\\032", -1) // CTRL+Z character |
647 | | - return fmt.Sprintf("'%s'", valStr), nil |
| 643 | + valBytes := val.([]byte) |
| 644 | + |
| 645 | + ret := new(bytes.Buffer) |
| 646 | + ret.WriteByte('\'') |
| 647 | + for _, c := range valBytes { |
| 648 | + switch c { |
| 649 | + // '\032' is CTRL+Z character |
| 650 | + case '\\', '\'', '\032': |
| 651 | + ret.WriteByte('\\') |
| 652 | + ret.WriteByte(c) |
| 653 | + case '\000': |
| 654 | + ret.WriteByte('\\') |
| 655 | + ret.WriteByte('0') |
| 656 | + default: |
| 657 | + ret.WriteByte(c) |
| 658 | + } |
| 659 | + } |
| 660 | + ret.WriteByte('\'') |
| 661 | + return ret.String(), nil |
648 | 662 | } |
649 | 663 |
|
650 | 664 | func (q *Quote) WithChildren(children ...sql.Expression) (sql.Expression, error) { |
|
0 commit comments