Skip to content

Commit c27f19d

Browse files
committed
add: golang sql interface
1 parent d964ddb commit c27f19d

File tree

4 files changed

+186
-3
lines changed

4 files changed

+186
-3
lines changed

chdb/driver/driver.go

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
package chdb
2+
3+
import (
4+
"context"
5+
"database/sql"
6+
"database/sql/driver"
7+
"fmt"
8+
"reflect"
9+
"bytes"
10+
wrapper "github.com/chdb-io/chdb-go/chdb"
11+
"github.com/chdb-io/chdb-go/chdbstable"
12+
"github.com/apache/arrow/go/v14/arrow/ipc"
13+
)
14+
15+
func init() {
16+
sql.Register("chdb", Driver{})
17+
}
18+
19+
type connector struct {
20+
}
21+
22+
// Connect returns a connection to a database.
23+
func (c *connector) Connect(ctx context.Context) (driver.Conn, error) {
24+
return &conn{}, nil
25+
}
26+
27+
// Driver returns the underying Driver of the connector,
28+
// compatibility with the Driver method on sql.DB
29+
func (c *connector) Driver() driver.Driver { return Driver{} }
30+
31+
type Driver struct{}
32+
33+
// Open returns a new connection to the database.
34+
func (d Driver) Open(name string) (driver.Conn, error) {
35+
return &conn{}, nil
36+
}
37+
38+
// OpenConnector expects the same format as driver.Open
39+
func (d Driver) OpenConnector(dataSourceName string) (driver.Connector, error) {
40+
return &connector{}, nil
41+
}
42+
43+
type conn struct {
44+
}
45+
46+
func (c *conn) Close() error {
47+
return nil
48+
}
49+
50+
func (c *conn) Query(query string, values []driver.Value) (driver.Rows, error) {
51+
namedValues := make([]driver.NamedValue, len(values))
52+
for i, value := range values {
53+
namedValues[i] = driver.NamedValue{
54+
// nb: Name field is optional
55+
Ordinal: i,
56+
Value: value,
57+
}
58+
}
59+
return c.QueryContext(context.Background(), query, namedValues)
60+
}
61+
62+
func (c *conn) QueryContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Rows, error) {
63+
result := wrapper.Query(query, "Arrow")
64+
reader := bytes.NewReader(result.Buf())
65+
// rr, err := ipc.NewReader(reader, ipc.WithAllocator(memory.DefaultAllocator))
66+
rr, err := ipc.NewFileReader(reader)
67+
if err != nil {
68+
return nil, err
69+
}
70+
return &rows{localResult: result, reader: rr}, nil
71+
}
72+
73+
func (c *conn) Begin() (driver.Tx, error) {
74+
return nil, fmt.Errorf("does not support Transcation")
75+
}
76+
77+
func (c *conn) Prepare(query string) (driver.Stmt, error) {
78+
return c.PrepareContext(context.Background(), query)
79+
}
80+
81+
func (c *conn) PrepareContext(ctx context.Context, query string) (driver.Stmt, error) {
82+
return nil, fmt.Errorf("does not support prepare statement")
83+
}
84+
85+
// todo: func(c *conn) Prepare(query string)
86+
// todo: func(c *conn) PrepareContext(ctx context.Context, query string)
87+
// todo: prepared statment
88+
89+
type rows struct {
90+
localResult *chdbstable.LocalResult
91+
// reader *ipc.Reader
92+
reader *ipc.FileReader
93+
}
94+
95+
func (r *rows) Columns() ([]string) {
96+
fmt.Println(r.reader.Schema().Metadata().Keys())
97+
return r.reader.Schema().Metadata().Keys()
98+
}
99+
100+
func (r *rows) Close() error {
101+
return nil
102+
}
103+
104+
func (r *rows) Next(dest []driver.Value) error {
105+
return nil
106+
}
107+
108+
func (r *rows) ColumnTypeDatabaseTypeName(index int) string {
109+
return ""
110+
}
111+
112+
func (r *rows) ColumnTypeNullable(index int) (nullable, ok bool) {
113+
return
114+
}
115+
116+
func (r *rows) ColumnTypePrecisionScale(index int) (precision, scale int64, ok bool) {
117+
return
118+
}
119+
120+
func (r *rows) ColumnTypeScanType(index int) reflect.Type {
121+
return reflect.TypeOf(nil)
122+
}

chdb/driver/driver_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package chdb
2+
3+
import (
4+
"testing"
5+
"database/sql"
6+
"fmt"
7+
)
8+
9+
func TestDb(t *testing.T) {
10+
db, err := sql.Open("chdb", "")
11+
if err != nil {
12+
t.Errorf("open db fail")
13+
}
14+
if db.Ping() != nil {
15+
t.Errorf("ping db fail")
16+
}
17+
rows, err := db.Query("SELECT version()");
18+
if err != nil {
19+
t.Errorf("run Query fail, err:%s", err)
20+
}
21+
col, err := rows.Columns()
22+
fmt.Printf("col: %v\n", col)
23+
}

go.mod

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,20 @@ go 1.21.5
55
require github.com/c-bata/go-prompt v0.2.6
66

77
require (
8-
github.com/mattn/go-colorable v0.1.7 // indirect
9-
github.com/mattn/go-isatty v0.0.12 // indirect
8+
github.com/apache/arrow/go/v14 v14.0.2 // indirect
9+
github.com/goccy/go-json v0.10.2 // indirect
10+
github.com/google/flatbuffers v23.5.26+incompatible // indirect
11+
github.com/klauspost/compress v1.16.7 // indirect
12+
github.com/klauspost/cpuid/v2 v2.2.5 // indirect
13+
github.com/mattn/go-colorable v0.1.13 // indirect
14+
github.com/mattn/go-isatty v0.0.19 // indirect
1015
github.com/mattn/go-runewidth v0.0.9 // indirect
1116
github.com/mattn/go-tty v0.0.3 // indirect
17+
github.com/pierrec/lz4/v4 v4.1.18 // indirect
1218
github.com/pkg/term v1.2.0-beta.2 // indirect
13-
golang.org/x/sys v0.0.0-20200918174421-af09f7315aff // indirect
19+
github.com/zeebo/xxh3 v1.0.2 // indirect
20+
golang.org/x/mod v0.13.0 // indirect
21+
golang.org/x/sys v0.13.0 // indirect
22+
golang.org/x/tools v0.14.0 // indirect
23+
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect
1424
)

go.sum

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,38 @@
1+
github.com/apache/arrow/go/v14 v14.0.2 h1:N8OkaJEOfI3mEZt07BIkvo4sC6XDbL+48MBPWO5IONw=
2+
github.com/apache/arrow/go/v14 v14.0.2/go.mod h1:u3fgh3EdgN/YQ8cVQRguVW3R+seMybFg8QBQ5LU+eBY=
13
github.com/c-bata/go-prompt v0.2.6 h1:POP+nrHE+DfLYx370bedwNhsqmpCUynWPxuHi0C5vZI=
24
github.com/c-bata/go-prompt v0.2.6/go.mod h1:/LMAke8wD2FsNu9EXNdHxNLbd9MedkPnCdfpU9wwHfY=
5+
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
6+
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
7+
github.com/google/flatbuffers v23.5.26+incompatible h1:M9dgRyhJemaM4Sw8+66GHBu8ioaQmyPLg1b8VwK5WJg=
8+
github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
9+
github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I=
10+
github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
11+
github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg=
12+
github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
313
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
414
github.com/mattn/go-colorable v0.1.7 h1:bQGKb3vps/j0E9GfJQ03JyhRuxsvdAanXlT9BTw3mdw=
515
github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
16+
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
617
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
718
github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
819
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
920
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
21+
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
22+
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
1023
github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
1124
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
1225
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
1326
github.com/mattn/go-tty v0.0.3 h1:5OfyWorkyO7xP52Mq7tB36ajHDG5OHrmBGIS/DtakQI=
1427
github.com/mattn/go-tty v0.0.3/go.mod h1:ihxohKRERHTVzN+aSVRwACLCeqIoZAWpoICkkvrWyR0=
28+
github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ=
29+
github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
1530
github.com/pkg/term v1.2.0-beta.2 h1:L3y/h2jkuBVFdWiJvNfYfKmzcCnILw7mJWm2JQuMppw=
1631
github.com/pkg/term v1.2.0-beta.2/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw=
32+
github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0=
33+
github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
34+
golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY=
35+
golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
1736
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
1837
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
1938
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -23,3 +42,12 @@ golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7w
2342
golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
2443
golang.org/x/sys v0.0.0-20200918174421-af09f7315aff h1:1CPUrky56AcgSpxz/KfgzQWzfG09u5YOL8MvPYBlrL8=
2544
golang.org/x/sys v0.0.0-20200918174421-af09f7315aff/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
45+
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
46+
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
47+
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
48+
golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
49+
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
50+
golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc=
51+
golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg=
52+
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk=
53+
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=

0 commit comments

Comments
 (0)