mirror of
https://github.com/uptrace/go-clickhouse.git
synced 2025-06-08 23:26:11 +02:00
The documentation (http://devdoc.net/database/ClickhouseDocs_19.4.1.3-docs/query_language/select/) says FINAL has to be placed right after the table name, before SAMPLE: SELECT [DISTINCT] expr_list [FROM [db.]table | (subquery) | table_function] [FINAL] [SAMPLE sample_coeff] At the moment it's appended to the end of the query which results in invalid queries being generated when there are WHERE, ORDER BY or any other clauses used.
139 lines
3.5 KiB
Go
139 lines
3.5 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")
|
|
},
|
|
}
|
|
|
|
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))
|
|
}
|
|
})
|
|
}
|
|
}
|