@@ -10,6 +10,218 @@ import (
10
10
zetasqlite "github.com/goccy/go-zetasqlite"
11
11
)
12
12
13
+ func TestDriverAlter (t * testing.T ) {
14
+ db , err := sql .Open ("zetasqlite" , ":memory:" )
15
+ if err != nil {
16
+ t .Fatal (err )
17
+ }
18
+ if _ , err := db .Exec (`
19
+ CREATE TABLE IF NOT EXISTS Singers (
20
+ SingerId INT64 NOT NULL,
21
+ FirstName STRING(1024),
22
+ LastName STRING(1024),
23
+ SingerInfo BYTES(MAX)
24
+ )` ); err != nil {
25
+ t .Fatal (err )
26
+ }
27
+ if _ , err := db .Exec (`INSERT Singers (SingerId, FirstName, LastName) VALUES (1, 'John', 'Titor')` ); err != nil {
28
+ t .Fatal (err )
29
+ }
30
+ row := db .QueryRow ("SELECT SingerId, FirstName, LastName FROM Singers WHERE SingerId = @id" , 1 )
31
+ if row .Err () != nil {
32
+ t .Fatal (row .Err ())
33
+ }
34
+ var (
35
+ singerID int64
36
+ firstName string
37
+ lastName string
38
+ )
39
+ if err := row .Scan (& singerID , & firstName , & lastName ); err != nil {
40
+ t .Fatal (err )
41
+ }
42
+ if singerID != 1 || firstName != "John" || lastName != "Titor" {
43
+ t .Fatalf ("failed to find row %v %v %v" , singerID , firstName , lastName )
44
+ }
45
+
46
+ if _ , err := db .Exec (`
47
+ CREATE VIEW IF NOT EXISTS SingerNames AS SELECT FirstName || ' ' || LastName AS Name FROM Singers` ); err != nil {
48
+ t .Fatal (err )
49
+ }
50
+
51
+ viewRow := db .QueryRow ("SELECT Name FROM SingerNames LIMIT 1" )
52
+ if viewRow .Err () != nil {
53
+ t .Fatal (viewRow .Err ())
54
+ }
55
+
56
+ var name string
57
+
58
+ if err := viewRow .Scan (& name ); err != nil {
59
+ t .Fatal (err )
60
+ }
61
+ if name != "John Titor" {
62
+ t .Fatalf ("failed to find view row" )
63
+ }
64
+
65
+ // Test ALTER TABLE SET OPTIONS
66
+ if _ , err := db .Exec (`ALTER TABLE Singers SET OPTIONS (description="Famous singers")` ); err != nil {
67
+ t .Fatal (err )
68
+ }
69
+
70
+ // Test ALTER TABLE ADD COLUMN
71
+ if _ , err := db .Exec (`ALTER TABLE Singers ADD COLUMN Age INT64, ADD COLUMN IsSingle BOOL` ); err != nil {
72
+ t .Fatal (err )
73
+ }
74
+
75
+ // Verify the changes
76
+ row = db .QueryRow ("SELECT SingerId, FirstName, LastName, Age, IsSingle FROM Singers WHERE SingerId = @id" , 1 )
77
+ if row .Err () != nil {
78
+ t .Fatal (row .Err ())
79
+ }
80
+
81
+ var age sql.NullInt64
82
+ var isSingle sql.NullBool
83
+ if err := row .Scan (& singerID , & firstName , & lastName , & age , & isSingle ); err != nil {
84
+ t .Fatal (err )
85
+ }
86
+ if singerID != 1 || firstName != "John" || lastName != "Titor" || age .Valid || isSingle .Valid {
87
+ t .Fatalf ("failed to find row after ALTER TABLE statements" )
88
+ }
89
+
90
+ if _ , err := db .Exec (`INSERT Singers (SingerId, FirstName, LastName, Age, IsSingle) VALUES (1, 'John', 'Titor', 10, TRUE)` ); err != nil {
91
+ t .Fatal (err )
92
+ }
93
+ row = db .QueryRow ("SELECT SingerId, FirstName, LastName, Age, isSingle FROM Singers WHERE SingerId = @id AND isSingle IS NOT NULL" , 1 )
94
+ if row .Err () != nil {
95
+ t .Fatal (row .Err ())
96
+ }
97
+ if err := row .Scan (& singerID , & firstName , & lastName , & age , & isSingle ); err != nil {
98
+ t .Fatal (err )
99
+ }
100
+ if singerID != 1 || firstName != "John" || lastName != "Titor" || age .Int64 != 10 || isSingle .Bool != true {
101
+ t .Fatalf ("failed to find row %v %v %v %v %v" , singerID , firstName , lastName , age , isSingle )
102
+ }
103
+
104
+ if _ , err := db .Exec (`
105
+ ALTER TABLE Artists
106
+ ADD COLUMN Age INT64,
107
+ ADD COLUMN Nationality STRING NOT NULL DEFAULT 'Unknown',
108
+ DROP COLUMN LastName,
109
+ RENAME COLUMN GivenName TO FirstName
110
+ RENAME TO Musicians
111
+ ` ); err != nil {
112
+ t .Fatal (err )
113
+ }
114
+
115
+ // Verify the changes
116
+ row = db .QueryRow ("SELECT SingerID, FirstName, Age, Nationality FROM Musicians WHERE SingerId = @id" , 1 )
117
+ if row .Err () != nil {
118
+ t .Fatal (row .Err ())
119
+ }
120
+
121
+ //var nationality sql.NullString
122
+ //if err := row.Scan(&singerID, &firstName, &lastName, &age, &nationality); err != nil {
123
+ // t.Fatal(err)
124
+ //}
125
+ //if singerID != 1 || firstName != "John" || lastName != "Titor" || age.Valid || nationality.Valid {
126
+ // t.Fatalf("failed to find row after multi-action ALTER TABLE statement")
127
+ //}
128
+ }
129
+
130
+ func TestDriverAlter2 (t * testing.T ) {
131
+ db , err := sql .Open ("zetasqlite" , ":memory:" )
132
+ if err != nil {
133
+ t .Fatal (err )
134
+ }
135
+ if _ , err := db .Exec (`
136
+ CREATE TABLE IF NOT EXISTS Singers (
137
+ SingerId INT64 NOT NULL,
138
+ FirstName STRING(1024),
139
+ LastName STRING(1024),
140
+ SingerInfo BYTES(MAX)
141
+ )` ); err != nil {
142
+ t .Fatal (err )
143
+ }
144
+ if _ , err := db .Exec (`INSERT Singers (SingerId, FirstName, LastName) VALUES (1, 'John', 'Titor')` ); err != nil {
145
+ t .Fatal (err )
146
+ }
147
+ row := db .QueryRow ("SELECT SingerId, FirstName, LastName FROM Singers WHERE SingerId = @id" , 1 )
148
+ if row .Err () != nil {
149
+ t .Fatal (row .Err ())
150
+ }
151
+ var (
152
+ singerID int64
153
+ firstName string
154
+ lastName string
155
+ )
156
+ if err := row .Scan (& singerID , & firstName , & lastName ); err != nil {
157
+ t .Fatal (err )
158
+ }
159
+ if singerID != 1 || firstName != "John" || lastName != "Titor" {
160
+ t .Fatalf ("failed to find row %v %v %v" , singerID , firstName , lastName )
161
+ }
162
+
163
+ if _ , err := db .Exec (`
164
+ CREATE VIEW IF NOT EXISTS SingerNames AS SELECT FirstName || ' ' || LastName AS Name FROM Singers` ); err != nil {
165
+ t .Fatal (err )
166
+ }
167
+
168
+ viewRow := db .QueryRow ("SELECT Name FROM SingerNames LIMIT 1" )
169
+ if viewRow .Err () != nil {
170
+ t .Fatal (viewRow .Err ())
171
+ }
172
+
173
+ var name string
174
+
175
+ if err := viewRow .Scan (& name ); err != nil {
176
+ t .Fatal (err )
177
+ }
178
+ if name != "John Titor" {
179
+ t .Fatalf ("failed to find view row" )
180
+ }
181
+
182
+ // Test ALTER TABLE SET OPTIONS
183
+ //if _, err := db.Exec(`ALTER TABLE Singers SET OPTIONS (description="Famous singers")`); err != nil {
184
+ // t.Fatal(err)
185
+ //}
186
+ //
187
+ //// Test ALTER TABLE ADD COLUMN
188
+ //if _, err := db.Exec(`ALTER TABLE Singers ADD COLUMN Age INT64`); err != nil {
189
+ // t.Fatal(err)
190
+ //}
191
+
192
+ //// Test ALTER TABLE RENAME COLUMN
193
+ //if _, err := db.Exec(`ALTER TABLE Singers RENAME COLUMN FirstName TO GivenName`); err != nil {
194
+ // t.Fatal(err)
195
+ //}
196
+
197
+ // Test ALTER TABLE DROP COLUMN
198
+ //if _, err := db.Exec(`ALTER TABLE Singers DROP COLUMN SingerInfo`); err != nil {
199
+ // t.Fatal(err)
200
+ //}
201
+
202
+ if _ , err := db .Exec (`
203
+ ALTER TABLE Singers
204
+ ADD COLUMN Age INT64,
205
+ ADD COLUMN Nationality STRING
206
+ ` ); err != nil {
207
+ t .Fatal (err )
208
+ }
209
+
210
+ // Verify the changes
211
+ row = db .QueryRow ("SELECT SingerId, FirstName, Age, Nationality FROM Singers WHERE SingerId = @id" , 1 )
212
+ if row .Err () != nil {
213
+ t .Fatal (row .Err ())
214
+ }
215
+
216
+ //var nationality sql.NullString
217
+ //if err := row.Scan(&singerID, &firstName, &lastName, &age, &nationality); err != nil {
218
+ // t.Fatal(err)
219
+ //}
220
+ //if singerID != 1 || firstName != "John" || lastName != "Titor" || age.Valid || nationality.Valid {
221
+ // t.Fatalf("failed to find row after multi-action ALTER TABLE statement")
222
+ //}
223
+ }
224
+
13
225
func TestDriver (t * testing.T ) {
14
226
db , err := sql .Open ("zetasqlite" , ":memory:" )
15
227
if err != nil {
0 commit comments