1
0
mirror of https://github.com/uptrace/go-clickhouse.git synced 2025-06-06 23:16:18 +02:00
go-clickhouse/ch/query_test.go
2023-08-23 16:18:44 +03:00

149 lines
3.8 KiB
Go

package ch_test
import (
"fmt"
"path/filepath"
"testing"
"time"
"github.com/bradleyjkemp/cupaloy"
"github.com/uptrace/go-clickhouse/ch"
"github.com/uptrace/go-clickhouse/ch/chschema"
)
func TestQuery(t *testing.T) {
type Model struct {
ID uint64
String string
Bytes []byte
}
queries := []func(db *ch.DB) chschema.QueryAppender{
func(db *ch.DB) chschema.QueryAppender {
return db.NewCreateTable().Model((*Model)(nil))
},
func(db *ch.DB) chschema.QueryAppender {
return db.NewDropTable().Model((*Model)(nil))
},
func(db *ch.DB) chschema.QueryAppender {
return db.NewSelect().Model((*Model)(nil))
},
func(db *ch.DB) chschema.QueryAppender {
return db.NewSelect().Model((*Model)(nil)).ExcludeColumn("bytes")
},
func(db *ch.DB) chschema.QueryAppender {
return db.NewInsert().Model(new(Model))
},
func(db *ch.DB) chschema.QueryAppender {
return db.NewTruncateTable().Model(new(Model))
},
func(db *ch.DB) chschema.QueryAppender {
return db.NewSelect().
Model((*Model)(nil)).
Setting("max_rows_to_read = 100")
},
func(db *ch.DB) chschema.QueryAppender {
return db.NewSelect().
Model((*Model)(nil)).
Setting("max_rows_to_read = 100").
Setting("read_overflow_mode = 'break'")
},
func(db *ch.DB) chschema.QueryAppender {
return db.NewInsert().
TableExpr("dest").
TableExpr("src").
Where("_part = ?", "part_name").
Setting("max_threads = 1").
Setting("max_insert_threads = 1").
Setting("max_execution_time = 0")
},
func(db *ch.DB) chschema.QueryAppender {
return db.NewSelect().
Model((*Model)(nil)).
Sample("?", 1000)
},
func(db *ch.DB) chschema.QueryAppender {
type Model struct {
ch.CHModel `ch:"table:spans,partition:toYYYYMM(time)"`
ID uint64
Text string `ch:",lc"` // low cardinality column
Time time.Time `ch:",pk"` // ClickHouse primary key for order by
}
return db.NewCreateTable().Model((*Model)(nil)).
TTL("time + INTERVAL 30 DAY DELETE").
Partition("toDate(time)").
Order("id").
Setting("ttl_only_drop_parts = 1")
},
func(db *ch.DB) chschema.QueryAppender {
return db.NewDropView().View("view_name")
},
func(db *ch.DB) chschema.QueryAppender {
return db.NewDropView().IfExists().ViewExpr("view_name")
},
func(db *ch.DB) chschema.QueryAppender {
return db.NewCreateView().
Materialized().
IfNotExists().
View("view_name").
To("dest_table").
Column("col1").
ColumnExpr("col1 AS alias").
TableExpr("src_table AS alias").
Where("foo = bar").
Group("group1").
GroupExpr("group2, group3").
OrderExpr("order2, order3")
},
func(db *ch.DB) chschema.QueryAppender {
return db.NewSelect().
Model((*Model)(nil)).
Final()
},
func(db *ch.DB) chschema.QueryAppender {
return db.NewSelect().
Model((*Model)(nil)).
Where("id = ?", 1).
Final()
},
func(db *ch.DB) chschema.QueryAppender {
return db.NewSelect().
Model((*Model)(nil)).
Where("id = ?", 1).
Final().
Group("id").
OrderExpr("id")
},
func(db *ch.DB) chschema.QueryAppender {
q1 := db.NewSelect().Model(new(Model)).Where("1")
q2 := db.NewSelect().Model(new(Model))
return q1.Union(q2)
},
func(db *ch.DB) chschema.QueryAppender {
q1 := db.NewSelect().Model(new(Model)).Where("1")
q2 := db.NewSelect().Model(new(Model))
return q1.UnionAll(q2)
},
}
db := chDB()
defer db.Close()
snapshotsDir := filepath.Join("testdata", "snapshots")
snapshot := cupaloy.New(cupaloy.SnapshotSubdirectory(snapshotsDir))
for i, fn := range queries {
t.Run(fmt.Sprintf("%d", i), func(t *testing.T) {
q := fn(db)
query, err := q.AppendQuery(db.Formatter(), nil)
if err != nil {
snapshot.SnapshotT(t, err.Error())
} else {
snapshot.SnapshotT(t, string(query))
}
})
}
}