From b3b4b2269d16ae7a2e265ffab61f8b40a340cdf1 Mon Sep 17 00:00:00 2001 From: Felipe Lema Date: Mon, 25 Mar 2024 15:56:11 -0300 Subject: [PATCH 1/3] implement missing method --- clickhouse_std.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/clickhouse_std.go b/clickhouse_std.go index 779856c35d..12fc530381 100644 --- a/clickhouse_std.go +++ b/clickhouse_std.go @@ -222,6 +222,9 @@ func (std *stdDriver) ResetSession(ctx context.Context) error { func (std *stdDriver) Ping(ctx context.Context) error { return std.conn.ping(ctx) } func (std *stdDriver) Begin() (driver.Tx, error) { return std, nil } +func (std *stdDriver) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, error) { + return std, nil +} func (std *stdDriver) Commit() error { if std.commit == nil { From 5b21878b695416639dc094c69e09fadf4b2ca962 Mon Sep 17 00:00:00 2001 From: Felipe Lema Date: Mon, 25 Mar 2024 15:56:30 -0300 Subject: [PATCH 2/3] sprinkle assertions of implementations --- clickhouse_std.go | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/clickhouse_std.go b/clickhouse_std.go index 12fc530381..2e4fe69e36 100644 --- a/clickhouse_std.go +++ b/clickhouse_std.go @@ -110,6 +110,8 @@ func (o *stdConnOpener) Connect(ctx context.Context) (_ driver.Conn, err error) return nil, err } +var _ driver.Connector = (*stdConnOpener)(nil) + func init() { var debugf = func(format string, v ...any) {} sql.Register("clickhouse", &stdDriver{debugf: debugf}) @@ -196,6 +198,12 @@ type stdDriver struct { debugf func(format string, v ...any) } +var _ driver.Conn = (*stdDriver)(nil) +var _ driver.ConnBeginTx = (*stdDriver)(nil) +var _ driver.ExecerContext = (*stdDriver)(nil) +var _ driver.QueryerContext = (*stdDriver)(nil) +var _ driver.ConnPrepareContext = (*stdDriver)(nil) + func (std *stdDriver) Open(dsn string) (_ driver.Conn, err error) { var opt Options if err := opt.fromDSN(dsn); err != nil { @@ -211,6 +219,8 @@ func (std *stdDriver) Open(dsn string) (_ driver.Conn, err error) { return (&stdConnOpener{opt: o, debugf: debugf}).Connect(context.Background()) } +var _ driver.Driver = (*stdDriver)(nil) + func (std *stdDriver) ResetSession(ctx context.Context) error { if std.conn.isBad() { std.debugf("Resetting session because connection is bad") @@ -219,8 +229,12 @@ func (std *stdDriver) ResetSession(ctx context.Context) error { return nil } +var _ driver.SessionResetter = (*stdDriver)(nil) + func (std *stdDriver) Ping(ctx context.Context) error { return std.conn.ping(ctx) } +var _ driver.Pinger = (*stdDriver)(nil) + func (std *stdDriver) Begin() (driver.Tx, error) { return std, nil } func (std *stdDriver) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, error) { return std, nil @@ -251,8 +265,12 @@ func (std *stdDriver) Rollback() error { return nil } +var _ driver.Tx = (*stdDriver)(nil) + func (std *stdDriver) CheckNamedValue(nv *driver.NamedValue) error { return nil } +var _ driver.NamedValueChecker = (*stdDriver)(nil) + func (std *stdDriver) ExecContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Result, error) { if options := queryOptions(ctx); options.async.ok { return driver.RowsAffected(0), std.conn.asyncInsert(ctx, query, options.async.wait, rebind(args)...) @@ -343,6 +361,8 @@ func (s *stdBatch) ExecContext(ctx context.Context, args []driver.NamedValue) (d return s.Exec(values) } +var _ driver.StmtExecContext = (*stdBatch)(nil) + func (s *stdBatch) Query(args []driver.Value) (driver.Rows, error) { return nil, errors.New("only Exec method supported in batch mode") } @@ -362,6 +382,8 @@ func (r *stdRows) ColumnTypeScanType(idx int) reflect.Type { return r.rows.block.Columns[idx].ScanType() } +var _ driver.RowsColumnTypeScanType = (*stdRows)(nil) + func (r *stdRows) ColumnTypeDatabaseTypeName(idx int) string { return string(r.rows.block.Columns[idx].Type()) } @@ -384,6 +406,12 @@ func (r *stdRows) ColumnTypePrecisionScale(idx int) (precision, scale int64, ok return 0, 0, false } +var _ driver.Rows = (*stdRows)(nil) +var _ driver.RowsNextResultSet = (*stdRows)(nil) +var _ driver.RowsColumnTypeDatabaseTypeName = (*stdRows)(nil) +var _ driver.RowsColumnTypeNullable = (*stdRows)(nil) +var _ driver.RowsColumnTypePrecisionScale = (*stdRows)(nil) + func (r *stdRows) Next(dest []driver.Value) error { if len(r.rows.block.Columns) != len(dest) { err := fmt.Errorf("expected %d destination arguments in Next, not %d", len(r.rows.block.Columns), len(dest)) @@ -432,6 +460,8 @@ func (r *stdRows) NextResultSet() error { return nil } +var _ driver.RowsNextResultSet = (*stdRows)(nil) + func (r *stdRows) Close() error { err := r.rows.Close() if err != nil { @@ -439,3 +469,5 @@ func (r *stdRows) Close() error { } return err } + +var _ driver.Rows = (*stdRows)(nil) From d254e3be423a79db62e888e3692019b6aa8c7809 Mon Sep 17 00:00:00 2001 From: Felipe Lema Date: Mon, 25 Mar 2024 15:56:40 -0300 Subject: [PATCH 3/3] add note for viewers at home --- clickhouse_std.go | 1 + 1 file changed, 1 insertion(+) diff --git a/clickhouse_std.go b/clickhouse_std.go index 2e4fe69e36..464691569b 100644 --- a/clickhouse_std.go +++ b/clickhouse_std.go @@ -364,6 +364,7 @@ func (s *stdBatch) ExecContext(ctx context.Context, args []driver.NamedValue) (d var _ driver.StmtExecContext = (*stdBatch)(nil) func (s *stdBatch) Query(args []driver.Value) (driver.Rows, error) { + // Note: not implementing driver.StmtQueryContext accordingly return nil, errors.New("only Exec method supported in batch mode") }