1package clickhouse_test
2
3import (
4	"database/sql/driver"
5	"fmt"
6
7	//	"fmt"
8	"net"
9	"testing"
10	"time"
11
12	"github.com/ClickHouse/clickhouse-go"
13	"github.com/ClickHouse/clickhouse-go/lib/column"
14	"github.com/ClickHouse/clickhouse-go/lib/types"
15	"github.com/stretchr/testify/assert"
16)
17
18func Test_DirectInsert(t *testing.T) {
19	const (
20		ddl = `
21			CREATE TABLE clickhouse_test_direct_insert (
22				int8  Int8,
23				int16 Int16,
24				int32 Int32,
25				int64 Int64,
26				uint8  UInt8,
27				uint16 UInt16,
28				uint32 UInt32,
29				uint64 UInt64,
30				float32 Float32,
31				float64 Float64,
32				string  String,
33				fString FixedString(2),
34				date    Date,
35				datetime DateTime,
36				enum8    Enum8 ('a' = 1, 'b' = 2),
37				enum16   Enum16('c' = 1, 'd' = 2),
38				uuid     FixedString(16),
39				ip       FixedString(16)
40			) Engine=Memory
41		`
42		dml = `
43			INSERT INTO clickhouse_test_direct_insert (
44				int8,
45				int16,
46				int32,
47				int64,
48				uint8,
49				uint16,
50				uint32,
51				uint64,
52				float32,
53				float64,
54				string,
55				fString,
56				date,
57				datetime,
58				enum8,
59				enum16,
60				uuid,
61				ip
62			) VALUES (
63				?,
64				?,
65				?,
66				?,
67				?,
68				?,
69				?,
70				?,
71				?,
72				?,
73				?,
74				?,
75				?,
76				?,
77				?,
78				?,
79				?,
80				?
81			)
82		`
83	)
84	if connect, err := clickhouse.Open("tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) {
85		{
86			var (
87				tx, _   = connect.Begin()
88				stmt, _ = connect.Prepare("DROP TABLE IF EXISTS clickhouse_test_direct_insert")
89			)
90			stmt.Exec([]driver.Value{})
91			tx.Commit()
92		}
93		{
94			if tx, err := connect.Begin(); assert.NoError(t, err) {
95				if stmt, err := connect.Prepare(ddl); assert.NoError(t, err) {
96					if _, err := stmt.Exec([]driver.Value{}); assert.NoError(t, err) {
97						assert.NoError(t, tx.Commit())
98					}
99				}
100			}
101		}
102		{
103			if tx, err := connect.Begin(); assert.NoError(t, err) {
104				if stmt, err := connect.Prepare(dml); assert.NoError(t, err) {
105					for i := 0; i < 100; i++ {
106						_, err := stmt.Exec([]driver.Value{
107							int8(i),
108							int16(i),
109							int32(i),
110							int64(i),
111
112							uint8(i),
113							uint16(i),
114							uint32(i),
115							uint64(i),
116
117							float32(i),
118							float64(i),
119
120							"string",
121							"CH",
122							time.Now(),
123							time.Now(),
124
125							"a",
126							"d",
127
128							types.UUID("123e4567-e89b-12d3-a456-426655440000"),
129							column.IP(net.ParseIP("127.0.0.1")),
130						})
131						if !assert.NoError(t, err) {
132							return
133						}
134					}
135					assert.NoError(t, tx.Commit())
136				}
137			}
138		}
139	}
140}
141
142func Test_DirectArrayT(t *testing.T) {
143	const (
144		ddl = `
145			CREATE TABLE clickhouse_test_direct_array (
146				int8     Array(Int8),
147				int16    Array(Int16),
148				int32    Array(Int32),
149				int64    Array(Int64),
150				uint8    Array(UInt8),
151				uint16   Array(UInt16),
152				uint32   Array(UInt32),
153				uint64   Array(UInt64),
154				float32  Array(Float32),
155				float64  Array(Float64),
156				string   Array(String),
157				fString  Array(FixedString(2)),
158				date     Array(Date),
159				datetime Array(DateTime),
160				enum8    Array(Enum8 ('a' = 1, 'b' = 2)),
161				enum16   Array(Enum16('c' = 1, 'd' = 2)),
162				ipv4     Array(IPv4),
163				ipv6     Array(IPv6)
164			) Engine=Memory
165		`
166		dml = `
167			INSERT INTO clickhouse_test_direct_array (
168				int8,
169				int16,
170				int32,
171				int64,
172				uint8,
173				uint16,
174				uint32,
175				uint64,
176				float32,
177				float64,
178				string,
179				fString,
180				date,
181				datetime,
182				enum8,
183				enum16,
184				ipv4,
185				ipv6
186			) VALUES (
187				?,
188				?,
189				?,
190				?,
191				?,
192				?,
193				?,
194				?,
195				?,
196				?,
197				?,
198				?,
199				?,
200				?,
201				?,
202				?,
203				?,
204				?
205			)
206		`
207	)
208
209	if connect, err := clickhouse.Open("tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) {
210		{
211			var (
212				tx, _   = connect.Begin()
213				stmt, _ = connect.Prepare("DROP TABLE IF EXISTS clickhouse_test_direct_array")
214			)
215			stmt.Exec([]driver.Value{})
216			tx.Commit()
217		}
218		{
219			if tx, err := connect.Begin(); assert.NoError(t, err) {
220				if stmt, err := connect.Prepare(ddl); assert.NoError(t, err) {
221					if _, err := stmt.Exec([]driver.Value{}); assert.NoError(t, err) {
222						assert.NoError(t, tx.Commit())
223					}
224				}
225			}
226		}
227		{
228			if tx, err := connect.Begin(); assert.NoError(t, err) {
229				if stmt, err := connect.Prepare(dml); assert.NoError(t, err) {
230					for i := 0; i < 100; i++ {
231						_, err := stmt.Exec([]driver.Value{
232							clickhouse.Array([]int8{1, 2, 3}),
233							clickhouse.Array([]int16{5, 6, 7}),
234							clickhouse.Array([]int32{8, 9, 10}),
235							clickhouse.Array([]int64{11, 12, 13}),
236							clickhouse.Array([]uint8{14, 15, 16}),
237							clickhouse.Array([]uint16{17, 18, 19}),
238							clickhouse.Array([]uint32{20, 21, 22}),
239							clickhouse.Array([]uint64{23, 24, 25}),
240							clickhouse.Array([]float32{32.1, 32.2}),
241							clickhouse.Array([]float64{64.1, 64.2}),
242							clickhouse.Array([]string{fmt.Sprintf("A_%d", i), "B", "C"}),
243							clickhouse.ArrayFixedString(2, []string{"RU", "EN", "DE"}),
244							clickhouse.ArrayDate([]time.Time{time.Now(), time.Now()}),
245							clickhouse.ArrayDateTime([]time.Time{time.Now(), time.Now()}),
246							clickhouse.Array([]string{"a", "b"}),
247							clickhouse.Array([]string{"c", "d"}),
248							clickhouse.Array([]string{"1.2.3.4", "2.2.3.4"}),
249							clickhouse.Array([]string{"2001:0db8:85a3:0000:0000:8a2e:0370:7334"}),
250						})
251						if !assert.NoError(t, err) {
252							return
253						}
254					}
255					assert.NoError(t, tx.Commit())
256				}
257			}
258		}
259	}
260}
261