Skip to content

Commit dad603c

Browse files
committed
fix #192 Add new flavor Doris
1 parent 3e72c6a commit dad603c

8 files changed

+70
-12
lines changed

args.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,18 @@ func (args *Args) CompileWithFlavor(format string, flavor Flavor, initialValue .
149149
return
150150
}
151151

152+
// Value returns the value of the arg.
153+
// The arg must be the value returned by `Add`.
154+
func (args *Args) Value(arg string) interface{} {
155+
_, values := args.Compile(arg)
156+
157+
if len(values) == 0 {
158+
return nil
159+
}
160+
161+
return values[0]
162+
}
163+
152164
func (args *Args) compileNamed(ctx *argsCompileContext, format string) string {
153165
i := 1
154166

@@ -324,7 +336,7 @@ func (ctx *argsCompileContext) WriteValue(arg interface{}) {
324336

325337
default:
326338
switch ctx.Flavor {
327-
case MySQL, SQLite, CQL, ClickHouse, Presto, Informix:
339+
case MySQL, SQLite, CQL, ClickHouse, Presto, Informix, Doris:
328340
ctx.WriteRune('?')
329341
case PostgreSQL:
330342
fmt.Fprintf(ctx, "$%d", len(ctx.Values)+1)

args_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,3 +138,17 @@ func TestArgsAdd(t *testing.T) {
138138
a.Equal(actual, fmt.Sprintf("$%v", i))
139139
}
140140
}
141+
142+
func TestArgsValue(t *testing.T) {
143+
a := assert.New(t)
144+
args := &Args{}
145+
146+
v1 := 123
147+
arg1 := args.Add(v1)
148+
argInvalid := "invalid"
149+
argLooselyTyped := arg1 + "something else"
150+
151+
a.Equal(v1, args.Value(arg1))
152+
a.Equal(nil, args.Value(argInvalid))
153+
a.Equal(v1, args.Value(argLooselyTyped))
154+
}

flavor.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ const (
2121
Presto
2222
Oracle
2323
Informix
24+
Doris
2425
)
2526

2627
var (
@@ -64,6 +65,8 @@ func (f Flavor) String() string {
6465
return "Oracle"
6566
case Informix:
6667
return "Informix"
68+
case Doris:
69+
return "Doris"
6770
}
6871

6972
return "<invalid>"
@@ -94,6 +97,8 @@ func (f Flavor) Interpolate(sql string, args []interface{}) (string, error) {
9497
return oracleInterpolate(sql, args...)
9598
case Informix:
9699
return informixInterpolate(sql, args...)
100+
case Doris:
101+
return dorisInterpolate(sql, args...)
97102
}
98103

99104
return "", ErrInterpolateNotImplemented
@@ -162,7 +167,7 @@ func (f Flavor) NewCTEQueryBuilder() *CTEQueryBuilder {
162167
// - For PostgreSQL, SQL Server and SQLite, use double quote (") to quote name.
163168
func (f Flavor) Quote(name string) string {
164169
switch f {
165-
case MySQL, ClickHouse:
170+
case MySQL, ClickHouse, Doris:
166171
return fmt.Sprintf("`%s`", name)
167172
case PostgreSQL, SQLServer, SQLite, Presto, Oracle, Informix:
168173
return fmt.Sprintf(`"%s"`, name)
@@ -190,7 +195,7 @@ func (f Flavor) PrepareInsertIgnore(table string, ib *InsertBuilder) {
190195
// see https://www.sqlite.org/lang_insert.html
191196
ib.verb = "INSERT OR IGNORE"
192197

193-
case ClickHouse, CQL, SQLServer, Presto, Informix:
198+
case ClickHouse, CQL, SQLServer, Presto, Informix, Doris:
194199
// All other databases do not support insert ignore
195200
ib.verb = "INSERT"
196201

flavor_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ func TestFlavor(t *testing.T) {
2222
ClickHouse: "ClickHouse",
2323
Oracle: "Oracle",
2424
Informix: "Informix",
25+
Doris: "Doris",
2526
}
2627

2728
for f, expected := range cases {

interpolate.go

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,10 @@ func informixInterpolate(query string, args ...interface{}) (string, error) {
403403
return mysqlLikeInterpolate(Informix, query, args...)
404404
}
405405

406+
func dorisInterpolate(query string, args ...interface{}) (string, error) {
407+
return mysqlLikeInterpolate(Doris, query, args...)
408+
}
409+
406410
// oraclelInterpolate parses query and replace all ":*" with encoded args.
407411
// If there are more ":*" than len(args), returns ErrMissingArgs.
408412
// Otherwise, if there are less ":*" than len(args), the redundant args are omitted.
@@ -590,7 +594,7 @@ func encodeValue(buf []byte, arg interface{}, flavor Flavor) ([]byte, error) {
590594
v = v.Add(500 * time.Nanosecond)
591595

592596
switch flavor {
593-
case MySQL:
597+
case MySQL, ClickHouse, Informix, Doris:
594598
buf = append(buf, v.Format("'2006-01-02 15:04:05.999999'")...)
595599

596600
case PostgreSQL:
@@ -605,20 +609,13 @@ func encodeValue(buf []byte, arg interface{}, flavor Flavor) ([]byte, error) {
605609
case CQL:
606610
buf = append(buf, v.Format("'2006-01-02 15:04:05.999999Z0700'")...)
607611

608-
case ClickHouse:
609-
buf = append(buf, v.Format("'2006-01-02 15:04:05.999999'")...)
610-
611612
case Presto:
612613
buf = append(buf, v.Format("'2006-01-02 15:04:05.000'")...)
613614

614615
case Oracle:
615616
buf = append(buf, "to_timestamp('"...)
616617
buf = append(buf, v.Format("2006-01-02 15:04:05.999999")...)
617618
buf = append(buf, "', 'YYYY-MM-DD HH24:MI:SS.FF')"...)
618-
619-
case Informix:
620-
buf = append(buf, v.Format("'2006-01-02 15:04:05.999999'")...)
621-
622619
}
623620

624621
case fmt.Stringer:
@@ -741,6 +738,7 @@ func encodeValue(buf []byte, arg interface{}, flavor Flavor) ([]byte, error) {
741738
buf = append(buf, "hextoraw('"...)
742739
buf = appendHex(buf, data)
743740
buf = append(buf, "')"...)
741+
744742
default:
745743
return nil, ErrInterpolateUnsupportedArgs
746744
}

interpolate_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,11 @@ func TestFlavorInterpolate(t *testing.T) {
371371
"SELECT ?", []interface{}{errorValuer(1)},
372372
"", ErrErrorValuer,
373373
},
374+
{
375+
Doris,
376+
"SELECT ?", []interface{}{errorValuer(1)},
377+
"", ErrErrorValuer,
378+
},
374379
}
375380

376381
for idx, c := range cases {

select.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,11 +452,13 @@ func (sb *SelectBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{
452452
buf.WriteString(sb.offsetVar)
453453
}
454454
}
455+
455456
case CQL:
456457
if len(sb.limitVar) > 0 {
457458
buf.WriteLeadingString("LIMIT ")
458459
buf.WriteString(sb.limitVar)
459460
}
461+
460462
case PostgreSQL:
461463
if len(sb.limitVar) > 0 {
462464
buf.WriteLeadingString("LIMIT ")
@@ -467,6 +469,7 @@ func (sb *SelectBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{
467469
buf.WriteLeadingString("OFFSET ")
468470
buf.WriteString(sb.offsetVar)
469471
}
472+
470473
case Presto:
471474
// There might be a hidden constraint in Presto requiring offset to be set before limit.
472475
// The select statement documentation (https://prestodb.io/docs/current/sql/select.html)
@@ -536,6 +539,7 @@ func (sb *SelectBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{
536539
buf.WriteString(" + 1")
537540
}
538541
}
542+
539543
case Informix:
540544
// [SKIP N] FIRST M
541545
// M must be greater than 0
@@ -548,6 +552,18 @@ func (sb *SelectBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{
548552
buf.WriteLeadingString("FIRST ")
549553
buf.WriteString(sb.limitVar)
550554
}
555+
556+
case Doris:
557+
// #192: Doris doesn't support ? in OFFSET and LIMIT.
558+
if len(sb.limitVar) > 0 {
559+
buf.WriteLeadingString("LIMIT ")
560+
buf.WriteString(fmt.Sprint(sb.args.Value(sb.limitVar)))
561+
562+
if len(sb.offsetVar) > 0 {
563+
buf.WriteLeadingString("OFFSET ")
564+
buf.WriteString(fmt.Sprint(sb.args.Value(sb.offsetVar)))
565+
}
566+
}
551567
}
552568

553569
if len(sb.limitVar) > 0 {

select_test.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ func ExampleSelectBuilder_join() {
118118
}
119119

120120
func ExampleSelectBuilder_limit_offset() {
121-
flavors := []Flavor{MySQL, PostgreSQL, SQLite, SQLServer, CQL, ClickHouse, Presto, Oracle, Informix}
121+
flavors := []Flavor{MySQL, PostgreSQL, SQLite, SQLServer, CQL, ClickHouse, Presto, Oracle, Informix, Doris}
122122
results := make([][]string, len(flavors))
123123
sb := NewSelectBuilder()
124124
saveResults := func() {
@@ -246,6 +246,13 @@ func ExampleSelectBuilder_limit_offset() {
246246
// #3: SELECT * FROM user SKIP ? FIRST ?
247247
// #4: SELECT * FROM user FIRST ?
248248
// #5: SELECT * FROM user ORDER BY id SKIP ? FIRST ?
249+
//
250+
// Doris
251+
// #1: SELECT * FROM user
252+
// #2: SELECT * FROM user
253+
// #3: SELECT * FROM user LIMIT 1 OFFSET 0
254+
// #4: SELECT * FROM user LIMIT 1
255+
// #5: SELECT * FROM user ORDER BY id LIMIT 1 OFFSET 1
249256
}
250257

251258
func ExampleSelectBuilder_ForUpdate() {

0 commit comments

Comments
 (0)