Skip to content

Commit f3c89b8

Browse files
author
James Cor
committed
implement quote
1 parent 7ef3cc8 commit f3c89b8

File tree

4 files changed

+60
-3
lines changed

4 files changed

+60
-3
lines changed

enginetest/queries/queries.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10146,7 +10146,6 @@ from typestable`,
1014610146
{uint32(1000)},
1014710147
},
1014810148
},
10149-
1015010149
{
1015110150
Query: `select distinct pk1 from two_pk order by pk1`,
1015210151
Expected: []sql.Row{
@@ -10255,14 +10254,12 @@ from typestable`,
1025510254
{""},
1025610255
},
1025710256
},
10258-
1025910257
{
1026010258
Query: "select @@sql_mode = 1",
1026110259
Expected: []sql.Row{
1026210260
{false},
1026310261
},
1026410262
},
10265-
1026610263
{
1026710264
Query: "explain select 1",
1026810265
SkipServerEngine: true,
@@ -10290,6 +10287,14 @@ from typestable`,
1029010287
{" └─ name: "},
1029110288
},
1029210289
},
10290+
{
10291+
Query: "select quote(i), quote(s) from mytable",
10292+
Expected: []sql.Row{
10293+
{"'1'", "'first row'"},
10294+
{"'2'", "'second row'"},
10295+
{"'3'", "'third row'"},
10296+
},
10297+
},
1029310298
}
1029410299

1029510300
var KeylessQueries = []QueryTest{

sql/expression/function/registry.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ var BuiltIns = []sql.Function{
190190
sql.Function2{Name: "pow", Fn: NewPower},
191191
sql.Function2{Name: "power", Fn: NewPower},
192192
sql.Function1{Name: "quarter", Fn: NewQuarter},
193+
sql.Function1{Name: "quote", Fn: NewQuote},
193194
sql.Function1{Name: "radians", Fn: NewRadians},
194195
sql.FunctionN{Name: "rand", Fn: NewRand},
195196
sql.FunctionN{Name: "regexp_instr", Fn: NewRegexpInstr},

sql/expression/function/string.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -614,3 +614,42 @@ func (h *Bitlength) WithChildren(children ...sql.Expression) (sql.Expression, er
614614
}
615615
return NewBitlength(children[0]), nil
616616
}
617+
618+
type Quote struct {
619+
*UnaryFunc
620+
}
621+
622+
var _ sql.FunctionExpression = (*Bitlength)(nil)
623+
var _ sql.CollationCoercible = (*Bitlength)(nil)
624+
625+
func NewQuote(arg sql.Expression) sql.Expression {
626+
return &Quote{UnaryFunc: NewUnaryFunc(arg, "QUOTE", types.Text)}
627+
}
628+
629+
func (q *Quote) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) {
630+
arg, err := q.EvalChild(ctx, row)
631+
if err != nil {
632+
return nil, err
633+
}
634+
635+
val, _, err := types.Text.Convert(ctx, arg)
636+
if err != nil {
637+
return nil, err
638+
}
639+
if val == nil {
640+
return nil, nil
641+
}
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
648+
}
649+
650+
func (q *Quote) WithChildren(children ...sql.Expression) (sql.Expression, error) {
651+
if len(children) != 1 {
652+
return nil, sql.ErrInvalidChildrenNumber.New(q, len(children), 1)
653+
}
654+
return NewQuote(children[0]), nil
655+
}

sql/expression/function/string_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,3 +163,15 @@ func TestBitLength(t *testing.T) {
163163
tf.AddSucceeding(128, time.Now())
164164
tf.Test(t, nil, nil)
165165
}
166+
167+
func TestQuote(t *testing.T) {
168+
f := sql.Function1{Name: "quote", Fn: NewQuote}
169+
tf := NewTestFactory(f.Fn)
170+
tf.AddSucceeding(nil, nil)
171+
tf.AddSucceeding("'test'", "test")
172+
tf.AddSucceeding("'0'", false)
173+
tf.AddSucceeding("'1'", true)
174+
tf.AddSucceeding("'12345'", 12345)
175+
tf.AddSucceeding("'\\\\, \\', \\0, \\\032'", "\\, ', \000, \032")
176+
tf.Test(t, nil, nil)
177+
}

0 commit comments

Comments
 (0)