fb 0.5.5 → 0.5.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,428 +1,428 @@
1
- require 'test/unit'
2
- require 'test/FbTestCases'
3
- require 'fb'
4
- require 'date'
5
-
6
- include Fb
7
-
8
- class DataTypesTestCases < Test::Unit::TestCase
9
- include FbTestCases
10
-
11
- def gen_i(i)
12
- i
13
- end
14
-
15
- def gen_si(i)
16
- i
17
- end
18
-
19
- def gen_bi(i)
20
- i * 1000000000
21
- end
22
-
23
- def gen_f(i)
24
- i / 2
25
- end
26
-
27
- def gen_d(i)
28
- i * 3333 / 2
29
- end
30
-
31
- def gen_c(i)
32
- "%c" % (i + 64)
33
- end
34
-
35
- def gen_c10(i)
36
- gen_c(i) * 5
37
- end
38
-
39
- def gen_vc(i)
40
- gen_c(i)
41
- end
42
-
43
- def gen_vc10(i)
44
- gen_c(i) * i
45
- end
46
-
47
- def gen_vc10000(i)
48
- gen_c(i) * i * 1000
49
- end
50
-
51
- def gen_dt(i)
52
- Date.civil(2000, i+1, i+1)
53
- end
54
-
55
- def gen_tm(i)
56
- Time.utc(1990, 1, 1, 12, i, i)
57
- end
58
-
59
- def gen_ts(i)
60
- Time.local(2006, 1, 1, i, i, i)
61
- end
62
-
63
- def gen_n92(i)
64
- i * 100
65
- end
66
-
67
- def gen_d92(i)
68
- i * 100
69
- end
70
-
71
- def test_insert_basic_types
72
- sql_schema = <<-END
73
- create table TEST (
74
- I INTEGER,
75
- SI SMALLINT,
76
- BI BIGINT,
77
- F FLOAT,
78
- D DOUBLE PRECISION,
79
- C CHAR,
80
- C10 CHAR(10),
81
- VC VARCHAR(1),
82
- VC10 VARCHAR(10),
83
- VC10000 VARCHAR(10000),
84
- DT DATE,
85
- TM TIME,
86
- TS TIMESTAMP,
87
- N92 NUMERIC(9,2),
88
- D92 DECIMAL(9,2));
89
- END
90
- sql_insert = <<-END
91
- insert into test
92
- (I, SI, BI, F, D, C, C10, VC, VC10, VC10000, DT, TM, TS, N92, D92)
93
- values
94
- (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
95
- END
96
- sql_select = "select * from TEST order by I"
97
- Database.create(@parms) do |connection|
98
- connection.execute(sql_schema);
99
- connection.transaction do
100
- 10.times do |i|
101
- connection.execute(
102
- sql_insert,
103
- gen_i(i), gen_si(i), gen_bi(i),
104
- gen_f(i), gen_d(i),
105
- gen_c(i), gen_c10(i), gen_vc(i), gen_vc10(i), gen_vc10000(i),
106
- gen_dt(i), gen_tm(i), gen_ts(i),
107
- gen_n92(i), gen_d92(i))
108
- end
109
- end
110
- connection.execute(sql_select) do |cursor|
111
- i = 0
112
- cursor.each :hash do |row|
113
- assert_equal gen_i(i), row["I"], "INTEGER"
114
- assert_equal gen_si(i), row["SI"], "SMALLINT"
115
- assert_equal gen_bi(i), row["BI"], "BIGINT"
116
- assert_equal gen_f(i), row["F"], "FLOAT"
117
- assert_equal gen_d(i), row["D"], "DOUBLE PRECISION"
118
- assert_equal gen_c(i), row["C"], "CHAR"
119
- assert_equal gen_c10(i).ljust(10), row["C10"], "CHAR(10)"
120
- assert_equal gen_vc(i), row["VC"], "VARCHAR(1)"
121
- assert_equal gen_vc10(i), row["VC10"], "VARCHAR(10)"
122
- assert_equal gen_vc10000(i), row["VC10000"], "VARCHAR(10000)"
123
- assert_equal gen_dt(i), row["DT"], "DATE"
124
- #assert_equal gen_tm(i).strftime("%H%M%S"), row["TM"].utc.strftime("%H%M%S"), "TIME"
125
- assert_equal gen_ts(i), row["TS"], "TIMESTAMP"
126
- assert_equal gen_n92(i), row["N92"], "NUMERIC"
127
- assert_equal gen_d92(i), row["D92"], "DECIMAL"
128
- i += 1
129
- end
130
- end
131
- connection.drop
132
- end
133
- end
134
-
135
- def test_insert_blobs_text
136
- sql_schema = "create table test (id int, name varchar(20), memo blob sub_type text)"
137
- sql_insert = "insert into test (id, name, memo) values (?, ?, ?)"
138
- sql_select = "select * from test order by id"
139
- Database.create(@parms) do |connection|
140
- connection.execute(sql_schema);
141
- memo = IO.read("fb.c")
142
- assert memo.size > 50000
143
- connection.transaction do
144
- 10.times do |i|
145
- connection.execute(sql_insert, i, i.to_s, memo);
146
- end
147
- end
148
- connection.execute(sql_select) do |cursor|
149
- i = 0
150
- cursor.each :hash do |row|
151
- assert_equal i, row["ID"]
152
- assert_equal i.to_s, row["NAME"]
153
- assert_equal memo, row["MEMO"]
154
- i += 1
155
- end
156
- end
157
- connection.drop
158
- end
159
- end
160
-
161
- def test_insert_blobs_binary
162
- sql_schema = "create table test (id int, name varchar(20), attachment blob segment size 1000)"
163
- sql_insert = "insert into test (id, name, attachment) values (?, ?, ?)"
164
- sql_select = "select * from test order by id"
165
- #filename = "data.dat"
166
- filename = "fb.c"
167
- Database.create(@parms) do |connection|
168
- connection.execute(sql_schema);
169
- attachment = File.open(filename,"rb") do |f|
170
- f.read * 3
171
- end
172
- assert((attachment.size > 150000), "Not expected size")
173
- connection.transaction do
174
- 3.times do |i|
175
- connection.execute(sql_insert, i, i.to_s, attachment);
176
- end
177
- end
178
- connection.execute(sql_select) do |cursor|
179
- i = 0
180
- cursor.each :array do |row|
181
- assert_equal i, row[0], "ID's do not match"
182
- assert_equal i.to_s, row[1], "NAME's do not match"
183
- assert_equal attachment.size, row[2].size, "ATTACHMENT sizes do not match"
184
- i += 1
185
- end
186
- end
187
- connection.drop
188
- end
189
- end
190
-
191
- def test_insert_incorrect_types
192
- cols = %w{ I SI BI F D C C10 VC VC10 VC10000 DT TM TS }
193
- types = %w{ INTEGER SMALLINT BIGINT FLOAT DOUBLE\ PRECISION CHAR CHAR(10) VARCHAR(1) VARCHAR(10) VARCHAR(10000) DATE TIME TIMESTAMP }
194
- sql_schema = "";
195
- assert_equal cols.size, types.size
196
- cols.size.times do |i|
197
- sql_schema << "CREATE TABLE TEST_#{cols[i]} (VAL #{types[i]});\n"
198
- end
199
- Database.create(@parms) do |connection|
200
- connection.execute_script(sql_schema)
201
- cols.size.times do |i|
202
- sql_insert = "INSERT INTO TEST_#{cols[i]} (VAL) VALUES (?);"
203
- if cols[i] == 'I'
204
- assert_raise TypeError do
205
- connection.execute(sql_insert, {:five => "five"})
206
- end
207
- assert_raise TypeError do
208
- connection.execute(sql_insert, Time.now)
209
- end
210
- assert_raise RangeError do
211
- connection.execute(sql_insert, 5000000000)
212
- end
213
- elsif cols[i] == 'SI'
214
- assert_raise TypeError do
215
- connection.execute(sql_insert, {:five => "five"})
216
- end
217
- assert_raise TypeError do
218
- connection.execute(sql_insert, Time.now)
219
- end
220
- assert_raise RangeError do
221
- connection.execute(sql_insert, 100000)
222
- end
223
- elsif cols[i] == 'BI'
224
- assert_raise TypeError do
225
- connection.execute(sql_insert, {:five => "five"})
226
- end
227
- assert_raise TypeError do
228
- connection.execute(sql_insert, Time.now)
229
- end
230
- assert_raise RangeError do
231
- connection.execute(sql_insert, 184467440737095516160) # 2^64 * 10
232
- end
233
- elsif cols[i] == 'F'
234
- assert_raise TypeError do
235
- connection.execute(sql_insert, {:five => "five"})
236
- end
237
- assert_raise RangeError do
238
- connection.execute(sql_insert, 10 ** 39)
239
- end
240
- elsif cols[i] == 'D'
241
- assert_raise TypeError do
242
- connection.execute(sql_insert, {:five => "five"})
243
- end
244
- elsif cols[i] == 'VC'
245
- assert_raise RangeError do
246
- connection.execute(sql_insert, "too long")
247
- end
248
- assert_raise RangeError do
249
- connection.execute(sql_insert, 1.0/3.0)
250
- end
251
- elsif cols[i] == 'VC10'
252
- assert_raise RangeError do
253
- connection.execute(sql_insert, 1.0/3.0)
254
- end
255
- elsif cols[i].include?('VC10000')
256
- assert_raise RangeError do
257
- connection.execute(sql_insert, "X" * 10001)
258
- end
259
- elsif cols[i] == 'C'
260
- assert_raise RangeError do
261
- connection.execute(sql_insert, "too long")
262
- end
263
- elsif cols[i] == 'C10'
264
- assert_raise RangeError do
265
- connection.execute(sql_insert, Time.now)
266
- end
267
- elsif cols[i] == 'DT'
268
- assert_raise ArgumentError do
269
- connection.execute(sql_insert, Date)
270
- end
271
- assert_raise ArgumentError do
272
- connection.execute(sql_insert, 2006)
273
- end
274
- elsif cols[i] == 'TM'
275
- assert_raise TypeError do
276
- connection.execute(sql_insert, {:date => "2006/1/1"})
277
- end
278
- assert_raise TypeError do
279
- connection.execute(sql_insert, 10000)
280
- end
281
- elsif cols[i] == 'TS'
282
- assert_raise TypeError do
283
- connection.execute(sql_insert, 5.5)
284
- end
285
- assert_raise TypeError do
286
- connection.execute(sql_insert, 10000)
287
- end
288
- elsif cols[i] == 'N92'
289
- assert_raise TypeError do
290
- connection.execute(sql_insert, {:five => "five"})
291
- end
292
- assert_raise TypeError do
293
- connection.execute(sql_insert, Time.now)
294
- end
295
- assert_raise RangeError do
296
- connection.execute(sql_insert, 5000000000)
297
- end
298
- elsif cols[i] == 'D92'
299
- assert_raise TypeError do
300
- connection.execute(sql_insert, {:five => "five"})
301
- end
302
- assert_raise TypeError do
303
- connection.execute(sql_insert, Time.now)
304
- end
305
- assert_raise RangeError do
306
- connection.execute(sql_insert, 5000000000)
307
- end
308
- end
309
- end
310
- connection.drop
311
- end
312
- end
313
-
314
- def test_insert_correct_types
315
- cols = %w{ I SI BI F D C C10 VC VC10 VC10000 DT TM TS N92 D92 }
316
- types = %w{ INTEGER SMALLINT BIGINT FLOAT DOUBLE\ PRECISION CHAR CHAR(10) VARCHAR(1) VARCHAR(10) VARCHAR(10000) DATE TIME TIMESTAMP NUMERIC(9,2) DECIMAL(9,2) }
317
- sql_schema = "";
318
- assert_equal cols.size, types.size
319
- cols.size.times do |i|
320
- sql_schema << "CREATE TABLE TEST_#{cols[i]} (VAL #{types[i]});\n"
321
- end
322
- Database.create(@parms) do |connection|
323
- connection.execute_script(sql_schema)
324
- cols.size.times do |i|
325
- sql_insert = "INSERT INTO TEST_#{cols[i]} (VAL) VALUES (?);"
326
- sql_select = "SELECT * FROM TEST_#{cols[i]};"
327
- if cols[i] == 'I'
328
- connection.execute(sql_insert, 500_000)
329
- connection.execute(sql_insert, "500_000")
330
- vals = connection.query(sql_select)
331
- assert_equal 500_000, vals[0][0]
332
- assert_equal 500_000, vals[1][0]
333
- elsif cols[i] == 'SI'
334
- connection.execute(sql_insert, 32_123)
335
- connection.execute(sql_insert, "32_123")
336
- vals = connection.query(sql_select)
337
- assert_equal 32_123, vals[0][0]
338
- assert_equal 32_123, vals[1][0]
339
- elsif cols[i] == 'BI'
340
- connection.execute(sql_insert, 5_000_000_000)
341
- connection.execute(sql_insert, "5_000_000_000")
342
- vals = connection.query(sql_select)
343
- assert_equal 5_000_000_000, vals[0][0]
344
- assert_equal 5_000_000_000, vals[1][0]
345
- elsif cols[i] == 'F'
346
- connection.execute(sql_insert, 5.75)
347
- connection.execute(sql_insert, "5.75")
348
- vals = connection.query(sql_select)
349
- assert_equal 5.75, vals[0][0]
350
- assert_equal 5.75, vals[1][0]
351
- elsif cols[i] == 'D'
352
- connection.execute(sql_insert, 12345.12345)
353
- connection.execute(sql_insert, "12345.12345")
354
- vals = connection.query(sql_select)
355
- assert_equal 12345.12345, vals[0][0]
356
- assert_equal 12345.12345, vals[1][0]
357
- elsif cols[i] == 'VC'
358
- connection.execute(sql_insert, "5")
359
- connection.execute(sql_insert, 5)
360
- vals = connection.query(sql_select)
361
- assert_equal "5", vals[0][0]
362
- assert_equal "5", vals[1][0]
363
- elsif cols[i] == 'VC10'
364
- connection.execute(sql_insert, "1234567890")
365
- connection.execute(sql_insert, 1234567890)
366
- vals = connection.query(sql_select)
367
- assert_equal "1234567890", vals[0][0]
368
- assert_equal "1234567890", vals[1][0]
369
- elsif cols[i].include?('VC10000')
370
- connection.execute(sql_insert, "1" * 100)
371
- connection.execute(sql_insert, ("1" * 100).to_i)
372
- vals = connection.query(sql_select)
373
- assert_equal "1" * 100, vals[0][0]
374
- assert_equal "1" * 100, vals[1][0]
375
- elsif cols[i] == 'C'
376
- connection.execute(sql_insert, "5")
377
- connection.execute(sql_insert, 5)
378
- vals = connection.query(sql_select)
379
- assert_equal "5", vals[0][0]
380
- assert_equal "5", vals[1][0]
381
- elsif cols[i] == 'C10'
382
- connection.execute(sql_insert, "1234567890")
383
- connection.execute(sql_insert, 1234567890)
384
- vals = connection.query(sql_select)
385
- assert_equal "1234567890", vals[0][0]
386
- assert_equal "1234567890", vals[1][0]
387
- elsif cols[i] == 'DT'
388
- connection.execute(sql_insert, Date.civil(2000,2,2))
389
- connection.execute(sql_insert, "2000/2/2")
390
- connection.execute(sql_insert, "2000-2-2")
391
- vals = connection.query(sql_select)
392
- assert_equal Date.civil(2000,2,2), vals[0][0]
393
- assert_equal Date.civil(2000,2,2), vals[1][0]
394
- elsif cols[i] == 'TM'
395
- connection.execute(sql_insert, Time.utc(2000,1,1,2,22,22))
396
- connection.execute(sql_insert, "2000/1/1 2:22:22")
397
- connection.execute(sql_insert, "2000-1-1 2:22:22")
398
- vals = connection.query(sql_select)
399
- assert_equal Time.utc(2000,1,1,2,22,22), vals[0][0]
400
- assert_equal Time.utc(2000,1,1,2,22,22), vals[1][0]
401
- elsif cols[i] == 'TS'
402
- connection.execute(sql_insert, Time.local(2006,6,6,3,33,33))
403
- connection.execute(sql_insert, "2006/6/6 3:33:33")
404
- connection.execute(sql_insert, "2006-6-6 3:33:33")
405
- vals = connection.query(sql_select)
406
- assert_equal Time.local(2006,6,6,3,33,33), vals[0][0]
407
- assert_equal Time.local(2006,6,6,3,33,33), vals[1][0]
408
- assert_equal Time.local(2006,6,6,3,33,33), vals[2][0]
409
- elsif cols[i] == 'N92'
410
- connection.execute(sql_insert, 12345.12)
411
- connection.execute(sql_insert, "12345.12")
412
- vals = connection.query(sql_select)
413
- # puts vals.inspect
414
- assert_equal 12345.12, vals[0][0], "NUMERIC (decimal)"
415
- assert_equal 12345.12, vals[1][0], "NUMERIC (string)"
416
- elsif cols[i] == 'D92'
417
- connection.execute(sql_insert, 12345.12)
418
- connection.execute(sql_insert, "12345.12")
419
- vals = connection.query(sql_select)
420
- # puts vals.inspect
421
- assert_equal 12345.12, vals[0][0], "DECIMAL (decimal)"
422
- assert_equal 12345.12, vals[1][0], "DECIMAL (string)"
423
- end
424
- end
425
- connection.drop
426
- end
427
- end
428
- end
1
+ require 'test/unit'
2
+ require 'test/FbTestCases'
3
+ # require 'fb'
4
+ # require 'date'
5
+
6
+ # include Fb
7
+
8
+ class DataTypesTestCases < Test::Unit::TestCase
9
+ include FbTestCases
10
+
11
+ def gen_i(i)
12
+ i
13
+ end
14
+
15
+ def gen_si(i)
16
+ i
17
+ end
18
+
19
+ def gen_bi(i)
20
+ i * 1000000000
21
+ end
22
+
23
+ def gen_f(i)
24
+ i / 2
25
+ end
26
+
27
+ def gen_d(i)
28
+ i * 3333 / 2
29
+ end
30
+
31
+ def gen_c(i)
32
+ "%c" % (i + 64)
33
+ end
34
+
35
+ def gen_c10(i)
36
+ gen_c(i) * 5
37
+ end
38
+
39
+ def gen_vc(i)
40
+ gen_c(i)
41
+ end
42
+
43
+ def gen_vc10(i)
44
+ gen_c(i) * i
45
+ end
46
+
47
+ def gen_vc10000(i)
48
+ gen_c(i) * i * 1000
49
+ end
50
+
51
+ def gen_dt(i)
52
+ Date.civil(2000, i+1, i+1)
53
+ end
54
+
55
+ def gen_tm(i)
56
+ Time.utc(1990, 1, 1, 12, i, i)
57
+ end
58
+
59
+ def gen_ts(i)
60
+ Time.local(2006, 1, 1, i, i, i)
61
+ end
62
+
63
+ def gen_n92(i)
64
+ i * 100
65
+ end
66
+
67
+ def gen_d92(i)
68
+ i * 100
69
+ end
70
+
71
+ def test_insert_basic_types
72
+ sql_schema = <<-END
73
+ create table TEST (
74
+ I INTEGER,
75
+ SI SMALLINT,
76
+ BI BIGINT,
77
+ F FLOAT,
78
+ D DOUBLE PRECISION,
79
+ C CHAR,
80
+ C10 CHAR(10),
81
+ VC VARCHAR(1),
82
+ VC10 VARCHAR(10),
83
+ VC10000 VARCHAR(10000),
84
+ DT DATE,
85
+ TM TIME,
86
+ TS TIMESTAMP,
87
+ N92 NUMERIC(9,2),
88
+ D92 DECIMAL(9,2));
89
+ END
90
+ sql_insert = <<-END
91
+ insert into test
92
+ (I, SI, BI, F, D, C, C10, VC, VC10, VC10000, DT, TM, TS, N92, D92)
93
+ values
94
+ (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
95
+ END
96
+ sql_select = "select * from TEST order by I"
97
+ Database.create(@parms) do |connection|
98
+ connection.execute(sql_schema);
99
+ connection.transaction do
100
+ 10.times do |i|
101
+ connection.execute(
102
+ sql_insert,
103
+ gen_i(i), gen_si(i), gen_bi(i),
104
+ gen_f(i), gen_d(i),
105
+ gen_c(i), gen_c10(i), gen_vc(i), gen_vc10(i), gen_vc10000(i),
106
+ gen_dt(i), gen_tm(i), gen_ts(i),
107
+ gen_n92(i), gen_d92(i))
108
+ end
109
+ end
110
+ connection.execute(sql_select) do |cursor|
111
+ i = 0
112
+ cursor.each :hash do |row|
113
+ assert_equal gen_i(i), row["I"], "INTEGER"
114
+ assert_equal gen_si(i), row["SI"], "SMALLINT"
115
+ assert_equal gen_bi(i), row["BI"], "BIGINT"
116
+ assert_equal gen_f(i), row["F"], "FLOAT"
117
+ assert_equal gen_d(i), row["D"], "DOUBLE PRECISION"
118
+ assert_equal gen_c(i), row["C"], "CHAR"
119
+ assert_equal gen_c10(i).ljust(10), row["C10"], "CHAR(10)"
120
+ assert_equal gen_vc(i), row["VC"], "VARCHAR(1)"
121
+ assert_equal gen_vc10(i), row["VC10"], "VARCHAR(10)"
122
+ assert_equal gen_vc10000(i), row["VC10000"], "VARCHAR(10000)"
123
+ assert_equal gen_dt(i), row["DT"], "DATE"
124
+ #assert_equal gen_tm(i).strftime("%H%M%S"), row["TM"].utc.strftime("%H%M%S"), "TIME"
125
+ assert_equal gen_ts(i), row["TS"], "TIMESTAMP"
126
+ assert_equal gen_n92(i), row["N92"], "NUMERIC"
127
+ assert_equal gen_d92(i), row["D92"], "DECIMAL"
128
+ i += 1
129
+ end
130
+ end
131
+ connection.drop
132
+ end
133
+ end
134
+
135
+ def test_insert_blobs_text
136
+ sql_schema = "create table test (id int, name varchar(20), memo blob sub_type text)"
137
+ sql_insert = "insert into test (id, name, memo) values (?, ?, ?)"
138
+ sql_select = "select * from test order by id"
139
+ Database.create(@parms) do |connection|
140
+ connection.execute(sql_schema);
141
+ memo = IO.read("fb.c")
142
+ assert memo.size > 50000
143
+ connection.transaction do
144
+ 10.times do |i|
145
+ connection.execute(sql_insert, i, i.to_s, memo);
146
+ end
147
+ end
148
+ connection.execute(sql_select) do |cursor|
149
+ i = 0
150
+ cursor.each :hash do |row|
151
+ assert_equal i, row["ID"]
152
+ assert_equal i.to_s, row["NAME"]
153
+ assert_equal memo, row["MEMO"]
154
+ i += 1
155
+ end
156
+ end
157
+ connection.drop
158
+ end
159
+ end
160
+
161
+ def test_insert_blobs_binary
162
+ sql_schema = "create table test (id int, name varchar(20), attachment blob segment size 1000)"
163
+ sql_insert = "insert into test (id, name, attachment) values (?, ?, ?)"
164
+ sql_select = "select * from test order by id"
165
+ #filename = "data.dat"
166
+ filename = "fb.c"
167
+ Database.create(@parms) do |connection|
168
+ connection.execute(sql_schema);
169
+ attachment = File.open(filename,"rb") do |f|
170
+ f.read * 3
171
+ end
172
+ assert((attachment.size > 150000), "Not expected size")
173
+ connection.transaction do
174
+ 3.times do |i|
175
+ connection.execute(sql_insert, i, i.to_s, attachment);
176
+ end
177
+ end
178
+ connection.execute(sql_select) do |cursor|
179
+ i = 0
180
+ cursor.each :array do |row|
181
+ assert_equal i, row[0], "ID's do not match"
182
+ assert_equal i.to_s, row[1], "NAME's do not match"
183
+ assert_equal attachment.size, row[2].size, "ATTACHMENT sizes do not match"
184
+ i += 1
185
+ end
186
+ end
187
+ connection.drop
188
+ end
189
+ end
190
+
191
+ def test_insert_incorrect_types
192
+ cols = %w{ I SI BI F D C C10 VC VC10 VC10000 DT TM TS }
193
+ types = %w{ INTEGER SMALLINT BIGINT FLOAT DOUBLE\ PRECISION CHAR CHAR(10) VARCHAR(1) VARCHAR(10) VARCHAR(10000) DATE TIME TIMESTAMP }
194
+ sql_schema = "";
195
+ assert_equal cols.size, types.size
196
+ cols.size.times do |i|
197
+ sql_schema << "CREATE TABLE TEST_#{cols[i]} (VAL #{types[i]});\n"
198
+ end
199
+ Database.create(@parms) do |connection|
200
+ connection.execute_script(sql_schema)
201
+ cols.size.times do |i|
202
+ sql_insert = "INSERT INTO TEST_#{cols[i]} (VAL) VALUES (?);"
203
+ if cols[i] == 'I'
204
+ assert_raise TypeError do
205
+ connection.execute(sql_insert, {:five => "five"})
206
+ end
207
+ assert_raise TypeError do
208
+ connection.execute(sql_insert, Time.now)
209
+ end
210
+ assert_raise RangeError do
211
+ connection.execute(sql_insert, 5000000000)
212
+ end
213
+ elsif cols[i] == 'SI'
214
+ assert_raise TypeError do
215
+ connection.execute(sql_insert, {:five => "five"})
216
+ end
217
+ assert_raise TypeError do
218
+ connection.execute(sql_insert, Time.now)
219
+ end
220
+ assert_raise RangeError do
221
+ connection.execute(sql_insert, 100000)
222
+ end
223
+ elsif cols[i] == 'BI'
224
+ assert_raise TypeError do
225
+ connection.execute(sql_insert, {:five => "five"})
226
+ end
227
+ assert_raise TypeError do
228
+ connection.execute(sql_insert, Time.now)
229
+ end
230
+ assert_raise RangeError do
231
+ connection.execute(sql_insert, 184467440737095516160) # 2^64 * 10
232
+ end
233
+ elsif cols[i] == 'F'
234
+ assert_raise TypeError do
235
+ connection.execute(sql_insert, {:five => "five"})
236
+ end
237
+ assert_raise RangeError do
238
+ connection.execute(sql_insert, 10 ** 39)
239
+ end
240
+ elsif cols[i] == 'D'
241
+ assert_raise TypeError do
242
+ connection.execute(sql_insert, {:five => "five"})
243
+ end
244
+ elsif cols[i] == 'VC'
245
+ assert_raise RangeError do
246
+ connection.execute(sql_insert, "too long")
247
+ end
248
+ assert_raise RangeError do
249
+ connection.execute(sql_insert, 1.0/3.0)
250
+ end
251
+ elsif cols[i] == 'VC10'
252
+ assert_raise RangeError do
253
+ connection.execute(sql_insert, 1.0/3.0)
254
+ end
255
+ elsif cols[i].include?('VC10000')
256
+ assert_raise RangeError do
257
+ connection.execute(sql_insert, "X" * 10001)
258
+ end
259
+ elsif cols[i] == 'C'
260
+ assert_raise RangeError do
261
+ connection.execute(sql_insert, "too long")
262
+ end
263
+ elsif cols[i] == 'C10'
264
+ assert_raise RangeError do
265
+ connection.execute(sql_insert, Time.now)
266
+ end
267
+ elsif cols[i] == 'DT'
268
+ assert_raise ArgumentError do
269
+ connection.execute(sql_insert, Date)
270
+ end
271
+ assert_raise ArgumentError do
272
+ connection.execute(sql_insert, 2006)
273
+ end
274
+ elsif cols[i] == 'TM'
275
+ assert_raise TypeError do
276
+ connection.execute(sql_insert, {:date => "2006/1/1"})
277
+ end
278
+ assert_raise TypeError do
279
+ connection.execute(sql_insert, 10000)
280
+ end
281
+ elsif cols[i] == 'TS'
282
+ assert_raise TypeError do
283
+ connection.execute(sql_insert, 5.5)
284
+ end
285
+ assert_raise TypeError do
286
+ connection.execute(sql_insert, 10000)
287
+ end
288
+ elsif cols[i] == 'N92'
289
+ assert_raise TypeError do
290
+ connection.execute(sql_insert, {:five => "five"})
291
+ end
292
+ assert_raise TypeError do
293
+ connection.execute(sql_insert, Time.now)
294
+ end
295
+ assert_raise RangeError do
296
+ connection.execute(sql_insert, 5000000000)
297
+ end
298
+ elsif cols[i] == 'D92'
299
+ assert_raise TypeError do
300
+ connection.execute(sql_insert, {:five => "five"})
301
+ end
302
+ assert_raise TypeError do
303
+ connection.execute(sql_insert, Time.now)
304
+ end
305
+ assert_raise RangeError do
306
+ connection.execute(sql_insert, 5000000000)
307
+ end
308
+ end
309
+ end
310
+ connection.drop
311
+ end
312
+ end
313
+
314
+ def test_insert_correct_types
315
+ cols = %w{ I SI BI F D C C10 VC VC10 VC10000 DT TM TS N92 D92 }
316
+ types = %w{ INTEGER SMALLINT BIGINT FLOAT DOUBLE\ PRECISION CHAR CHAR(10) VARCHAR(1) VARCHAR(10) VARCHAR(10000) DATE TIME TIMESTAMP NUMERIC(9,2) DECIMAL(9,2) }
317
+ sql_schema = "";
318
+ assert_equal cols.size, types.size
319
+ cols.size.times do |i|
320
+ sql_schema << "CREATE TABLE TEST_#{cols[i]} (VAL #{types[i]});\n"
321
+ end
322
+ Database.create(@parms) do |connection|
323
+ connection.execute_script(sql_schema)
324
+ cols.size.times do |i|
325
+ sql_insert = "INSERT INTO TEST_#{cols[i]} (VAL) VALUES (?);"
326
+ sql_select = "SELECT * FROM TEST_#{cols[i]};"
327
+ if cols[i] == 'I'
328
+ connection.execute(sql_insert, 500_000)
329
+ connection.execute(sql_insert, "500_000")
330
+ vals = connection.query(sql_select)
331
+ assert_equal 500_000, vals[0][0]
332
+ assert_equal 500_000, vals[1][0]
333
+ elsif cols[i] == 'SI'
334
+ connection.execute(sql_insert, 32_123)
335
+ connection.execute(sql_insert, "32_123")
336
+ vals = connection.query(sql_select)
337
+ assert_equal 32_123, vals[0][0]
338
+ assert_equal 32_123, vals[1][0]
339
+ elsif cols[i] == 'BI'
340
+ connection.execute(sql_insert, 5_000_000_000)
341
+ connection.execute(sql_insert, "5_000_000_000")
342
+ vals = connection.query(sql_select)
343
+ assert_equal 5_000_000_000, vals[0][0]
344
+ assert_equal 5_000_000_000, vals[1][0]
345
+ elsif cols[i] == 'F'
346
+ connection.execute(sql_insert, 5.75)
347
+ connection.execute(sql_insert, "5.75")
348
+ vals = connection.query(sql_select)
349
+ assert_equal 5.75, vals[0][0]
350
+ assert_equal 5.75, vals[1][0]
351
+ elsif cols[i] == 'D'
352
+ connection.execute(sql_insert, 12345.12345)
353
+ connection.execute(sql_insert, "12345.12345")
354
+ vals = connection.query(sql_select)
355
+ assert_equal 12345.12345, vals[0][0]
356
+ assert_equal 12345.12345, vals[1][0]
357
+ elsif cols[i] == 'VC'
358
+ connection.execute(sql_insert, "5")
359
+ connection.execute(sql_insert, 5)
360
+ vals = connection.query(sql_select)
361
+ assert_equal "5", vals[0][0]
362
+ assert_equal "5", vals[1][0]
363
+ elsif cols[i] == 'VC10'
364
+ connection.execute(sql_insert, "1234567890")
365
+ connection.execute(sql_insert, 1234567890)
366
+ vals = connection.query(sql_select)
367
+ assert_equal "1234567890", vals[0][0]
368
+ assert_equal "1234567890", vals[1][0]
369
+ elsif cols[i].include?('VC10000')
370
+ connection.execute(sql_insert, "1" * 100)
371
+ connection.execute(sql_insert, ("1" * 100).to_i)
372
+ vals = connection.query(sql_select)
373
+ assert_equal "1" * 100, vals[0][0]
374
+ assert_equal "1" * 100, vals[1][0]
375
+ elsif cols[i] == 'C'
376
+ connection.execute(sql_insert, "5")
377
+ connection.execute(sql_insert, 5)
378
+ vals = connection.query(sql_select)
379
+ assert_equal "5", vals[0][0]
380
+ assert_equal "5", vals[1][0]
381
+ elsif cols[i] == 'C10'
382
+ connection.execute(sql_insert, "1234567890")
383
+ connection.execute(sql_insert, 1234567890)
384
+ vals = connection.query(sql_select)
385
+ assert_equal "1234567890", vals[0][0]
386
+ assert_equal "1234567890", vals[1][0]
387
+ elsif cols[i] == 'DT'
388
+ connection.execute(sql_insert, Date.civil(2000,2,2))
389
+ connection.execute(sql_insert, "2000/2/2")
390
+ connection.execute(sql_insert, "2000-2-2")
391
+ vals = connection.query(sql_select)
392
+ assert_equal Date.civil(2000,2,2), vals[0][0]
393
+ assert_equal Date.civil(2000,2,2), vals[1][0]
394
+ elsif cols[i] == 'TM'
395
+ connection.execute(sql_insert, Time.utc(2000,1,1,2,22,22))
396
+ connection.execute(sql_insert, "2000/1/1 2:22:22")
397
+ connection.execute(sql_insert, "2000-1-1 2:22:22")
398
+ vals = connection.query(sql_select)
399
+ assert_equal Time.utc(2000,1,1,2,22,22), vals[0][0]
400
+ assert_equal Time.utc(2000,1,1,2,22,22), vals[1][0]
401
+ elsif cols[i] == 'TS'
402
+ connection.execute(sql_insert, Time.local(2006,6,6,3,33,33))
403
+ connection.execute(sql_insert, "2006/6/6 3:33:33")
404
+ connection.execute(sql_insert, "2006-6-6 3:33:33")
405
+ vals = connection.query(sql_select)
406
+ assert_equal Time.local(2006,6,6,3,33,33), vals[0][0]
407
+ assert_equal Time.local(2006,6,6,3,33,33), vals[1][0]
408
+ assert_equal Time.local(2006,6,6,3,33,33), vals[2][0]
409
+ elsif cols[i] == 'N92'
410
+ connection.execute(sql_insert, 12345.12)
411
+ connection.execute(sql_insert, "12345.12")
412
+ vals = connection.query(sql_select)
413
+ # puts vals.inspect
414
+ assert_equal 12345.12, vals[0][0], "NUMERIC (decimal)"
415
+ assert_equal 12345.12, vals[1][0], "NUMERIC (string)"
416
+ elsif cols[i] == 'D92'
417
+ connection.execute(sql_insert, 12345.12)
418
+ connection.execute(sql_insert, "12345.12")
419
+ vals = connection.query(sql_select)
420
+ # puts vals.inspect
421
+ assert_equal 12345.12, vals[0][0], "DECIMAL (decimal)"
422
+ assert_equal 12345.12, vals[1][0], "DECIMAL (string)"
423
+ end
424
+ end
425
+ connection.drop
426
+ end
427
+ end
428
+ end