ruby-oci8 2.1.5.1-x64-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.yardopts +17 -0
- data/COPYING +30 -0
- data/COPYING_old +64 -0
- data/ChangeLog +2779 -0
- data/Makefile +92 -0
- data/NEWS +660 -0
- data/README.md +43 -0
- data/VERSION +1 -0
- data/dist-files +91 -0
- data/docs/install-binary-package.md +40 -0
- data/docs/install-full-client.md +116 -0
- data/docs/install-instant-client.md +167 -0
- data/docs/platform-specific-issues.md +197 -0
- data/docs/report-installation-issue.md +50 -0
- data/lib/.document +1 -0
- data/lib/dbd/OCI8.rb +591 -0
- data/lib/oci8.rb +147 -0
- data/lib/oci8.rb.in +147 -0
- data/lib/oci8/.document +8 -0
- data/lib/oci8/bindtype.rb +350 -0
- data/lib/oci8/compat.rb +113 -0
- data/lib/oci8/connection_pool.rb +108 -0
- data/lib/oci8/cursor.rb +564 -0
- data/lib/oci8/datetime.rb +605 -0
- data/lib/oci8/encoding-init.rb +79 -0
- data/lib/oci8/encoding.yml +537 -0
- data/lib/oci8/metadata.rb +2092 -0
- data/lib/oci8/object.rb +605 -0
- data/lib/oci8/oci8.rb +560 -0
- data/lib/oci8/ocihandle.rb +607 -0
- data/lib/oci8/oracle_version.rb +143 -0
- data/lib/oci8/properties.rb +134 -0
- data/lib/oci8lib_200.so +0 -0
- data/metaconfig +142 -0
- data/pre-distclean.rb +7 -0
- data/ruby-oci8.gemspec +80 -0
- data/setup.rb +1333 -0
- data/test/README +42 -0
- data/test/config.rb +184 -0
- data/test/setup_test_object.sql +171 -0
- data/test/test_all.rb +54 -0
- data/test/test_appinfo.rb +63 -0
- data/test/test_array_dml.rb +333 -0
- data/test/test_bind_raw.rb +46 -0
- data/test/test_bind_string.rb +106 -0
- data/test/test_bind_time.rb +178 -0
- data/test/test_break.rb +124 -0
- data/test/test_clob.rb +98 -0
- data/test/test_connection_pool.rb +125 -0
- data/test/test_connstr.rb +81 -0
- data/test/test_datetime.rb +581 -0
- data/test/test_dbi.rb +366 -0
- data/test/test_dbi_clob.rb +53 -0
- data/test/test_encoding.rb +104 -0
- data/test/test_error.rb +88 -0
- data/test/test_metadata.rb +1485 -0
- data/test/test_object.rb +462 -0
- data/test/test_oci8.rb +489 -0
- data/test/test_oracle_version.rb +70 -0
- data/test/test_oradate.rb +256 -0
- data/test/test_oranumber.rb +787 -0
- data/test/test_rowid.rb +33 -0
- metadata +109 -0
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'oci8'
|
2
|
+
require 'test/unit'
|
3
|
+
require File.dirname(__FILE__) + '/config'
|
4
|
+
|
5
|
+
class TestConnStr < Test::Unit::TestCase
|
6
|
+
TEST_CASES =
|
7
|
+
[
|
8
|
+
# success cases:
|
9
|
+
# [ 'connect_string', expected result as an array]
|
10
|
+
# error cases:
|
11
|
+
# [ 'connect_string', ExceptionClass]
|
12
|
+
["hr/hr@host/service_name", ["hr", "hr", "host/service_name", nil]],
|
13
|
+
["sys/syspw@host/service_name AS SYSdba ", ["sys", "syspw", "host/service_name", :SYSDBA]],
|
14
|
+
["sys/syspw@host:1521/service_name as sysdba", ["sys", "syspw", "host:1521/service_name", :SYSDBA]],
|
15
|
+
# error cases
|
16
|
+
["service_name", ArgumentError],
|
17
|
+
["", ArgumentError],
|
18
|
+
["foo bar/baz", ArgumentError],
|
19
|
+
["foo@bar/baz", ArgumentError],
|
20
|
+
# parse_connect_string doesn't check validity of privilege.
|
21
|
+
["foo/bar as foo_bar", ["foo", "bar", nil, :FOO_BAR]],
|
22
|
+
|
23
|
+
##
|
24
|
+
## following test cases are contributed by Shiwei Zhang.
|
25
|
+
##
|
26
|
+
#"username/password"
|
27
|
+
["username/password", ["username", "password", nil, nil]],
|
28
|
+
#"username/password@[//]host[:port][/service_name]"
|
29
|
+
["username/password@host", ["username", "password", "host", nil]],
|
30
|
+
["username/password@host/service_name", ["username", "password", "host/service_name", nil]],
|
31
|
+
["username/password@host:1521", ["username", "password", "host:1521", nil]],
|
32
|
+
["username/password@host:1521/service_name", ["username", "password", "host:1521/service_name", nil]],
|
33
|
+
["username/password@//host", ["username", "password", "//host", nil]],
|
34
|
+
["username/password@//host/service_name", ["username", "password", "//host/service_name", nil]],
|
35
|
+
["username/password@//host:1521", ["username", "password", "//host:1521", nil]],
|
36
|
+
["username/password@//host:1521/service_name", ["username", "password", "//host:1521/service_name", nil]],
|
37
|
+
#"username/password as{sysoper|sysdba}"
|
38
|
+
["username/password as sysoper", ["username", "password", nil, :SYSOPER]],
|
39
|
+
["username/password as sysdba", ["username", "password", nil, :SYSDBA]],
|
40
|
+
#"username/password@[//]host[:port][/service_name] as {sysoper|sysdba}"
|
41
|
+
["username/password@host as sysoper", ["username", "password", "host", :SYSOPER]],
|
42
|
+
["username/password@host as sysdba", ["username", "password", "host", :SYSDBA]],
|
43
|
+
["username/password@host/service_name as sysoper", ["username", "password", "host/service_name", :SYSOPER]],
|
44
|
+
["username/password@host/service_name as sysdba", ["username", "password", "host/service_name", :SYSDBA]],
|
45
|
+
["username/password@host:1521 as sysoper", ["username", "password", "host:1521", :SYSOPER]],
|
46
|
+
["username/password@host:1521 as sysdba", ["username", "password", "host:1521", :SYSDBA]],
|
47
|
+
["username/password@host:1521/service_name as sysoper", ["username", "password", "host:1521/service_name", :SYSOPER]],
|
48
|
+
["username/password@host:1521/service_name as sysdba", ["username", "password", "host:1521/service_name", :SYSDBA]],
|
49
|
+
["username/password@//host as sysoper", ["username", "password", "//host", :SYSOPER]],
|
50
|
+
["username/password@//host as sysdba", ["username", "password", "//host", :SYSDBA]],
|
51
|
+
["username/password@//host/service_name as sysoper", ["username", "password", "//host/service_name", :SYSOPER]],
|
52
|
+
["username/password@//host/service_name as sysdba", ["username", "password", "//host/service_name", :SYSDBA]],
|
53
|
+
["username/password@//host:1521 as sysoper", ["username", "password", "//host:1521", :SYSOPER]],
|
54
|
+
["username/password@//host:1521 as sysdba", ["username", "password", "//host:1521", :SYSDBA]],
|
55
|
+
["username/password@//host:1521/service_name as sysoper", ["username", "password", "//host:1521/service_name", :SYSOPER]],
|
56
|
+
["username/password@//host:1521/service_name as sysdba", ["username", "password", "//host:1521/service_name", :SYSDBA]],
|
57
|
+
["/passwd@192.168.19.19:1521/orcl as sysdba", ["", "passwd", "192.168.19.19:1521/orcl", :SYSDBA]],
|
58
|
+
["/", [nil, nil, nil, nil]],
|
59
|
+
["/ as sysdba", [nil, nil, nil, :SYSDBA]],
|
60
|
+
]
|
61
|
+
|
62
|
+
def test_connstr
|
63
|
+
obj = OCI8.allocate # create an uninitialized object.
|
64
|
+
TEST_CASES.each do |test_case|
|
65
|
+
case test_case[1]
|
66
|
+
when Array
|
67
|
+
# use instance_eval to call a private method parse_connect_string.
|
68
|
+
result = obj.instance_eval { parse_connect_string(test_case[0]) }
|
69
|
+
assert_equal(test_case[1], result, test_case[0])
|
70
|
+
when Class
|
71
|
+
assert_raises(test_case[1]) do
|
72
|
+
result = obj.instance_eval { parse_connect_string(test_case[0]) }
|
73
|
+
end
|
74
|
+
else
|
75
|
+
raise "unsupported testcase"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
Test::Unit::AutoRunner.run() if $0 == __FILE__
|
@@ -0,0 +1,581 @@
|
|
1
|
+
require 'oci8'
|
2
|
+
require 'test/unit'
|
3
|
+
require File.dirname(__FILE__) + '/config'
|
4
|
+
require 'scanf'
|
5
|
+
|
6
|
+
class TestDateTime < Test::Unit::TestCase
|
7
|
+
|
8
|
+
def timezone_string(tzh, tzm)
|
9
|
+
if tzh >= 0
|
10
|
+
format("+%02d:%02d", tzh, tzm)
|
11
|
+
else
|
12
|
+
format("-%02d:%02d", -tzh, -tzm)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def string_to_time(str)
|
17
|
+
/(\d+)-(\d+)-(\d+) ?(?:(\d+):(\d+):(\d+))?(?:\.(\d+))? ?([+-]\d+:\d+)?/ =~ str
|
18
|
+
if $7
|
19
|
+
subsec = $7.to_i.to_r / ('1' + '0' * ($7.length)).to_i
|
20
|
+
end
|
21
|
+
convert_to_time($1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_i, subsec, $8)
|
22
|
+
end
|
23
|
+
|
24
|
+
def string_to_datetime(str)
|
25
|
+
/(\d+)-(\d+)-(\d+) ?(?:(\d+):(\d+):(\d+))?(?:\.(\d+))? ?([+-]\d+:\d+)?/ =~ str
|
26
|
+
if $7
|
27
|
+
subsec = $7.to_i.to_r / ('1' + '0' * ($7.length)).to_i
|
28
|
+
end
|
29
|
+
convert_to_datetime($1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_i, subsec, $8)
|
30
|
+
end
|
31
|
+
|
32
|
+
def setup
|
33
|
+
@conn = get_oci8_connection
|
34
|
+
end
|
35
|
+
|
36
|
+
def teardown
|
37
|
+
@conn.logoff
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_date_select
|
41
|
+
['2005-06-01 00:00:00',
|
42
|
+
'2005-12-31 23:59:59',
|
43
|
+
'2006-01-01 00:00:00'].each do |date|
|
44
|
+
@conn.exec(<<-EOS) do |row|
|
45
|
+
SELECT TO_DATE('#{date}', 'YYYY-MM-DD HH24:MI:SS') FROM dual
|
46
|
+
EOS
|
47
|
+
assert_equal(Time.local(*date.scanf("%d-%d-%d %d:%d:%d.%06d")), row[0])
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_date_out_bind
|
53
|
+
cursor = @conn.parse(<<-EOS)
|
54
|
+
BEGIN
|
55
|
+
:out := TO_DATE(:in, 'YYYY-MM-DD HH24:MI:SS');
|
56
|
+
END;
|
57
|
+
EOS
|
58
|
+
cursor.bind_param(:out, nil, DateTime)
|
59
|
+
cursor.bind_param(:in, nil, String, 36)
|
60
|
+
['2005-06-01 00:00:00',
|
61
|
+
'2005-12-31 23:59:59',
|
62
|
+
'2006-01-01 00:00:00'].each do |date|
|
63
|
+
cursor[:in] = date
|
64
|
+
cursor.exec
|
65
|
+
assert_equal(string_to_datetime(date), cursor[:out])
|
66
|
+
end
|
67
|
+
cursor.close
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_date_in_bind
|
71
|
+
cursor = @conn.parse(<<-EOS)
|
72
|
+
DECLARE
|
73
|
+
dt date;
|
74
|
+
BEGIN
|
75
|
+
dt := :in;
|
76
|
+
:out := TO_CHAR(dt, 'YYYY-MM-DD HH24:MI:SS');
|
77
|
+
END;
|
78
|
+
EOS
|
79
|
+
cursor.bind_param(:out, nil, String, 33)
|
80
|
+
cursor.bind_param(:in, nil, DateTime)
|
81
|
+
['2005-06-01 00:00:00',
|
82
|
+
'2005-12-31 23:59:59',
|
83
|
+
'2006-01-01 00:00:00'].each do |date|
|
84
|
+
cursor[:in] = string_to_datetime(date)
|
85
|
+
cursor.exec
|
86
|
+
assert_equal(date, cursor[:out])
|
87
|
+
end
|
88
|
+
cursor.close
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_timestamp_select
|
92
|
+
['2005-06-01 00:00:00.999999000',
|
93
|
+
'2005-12-31 23:59:59.999999000',
|
94
|
+
'2006-01-01 00:00:00.000000000'].each do |date|
|
95
|
+
@conn.exec(<<-EOS) do |row|
|
96
|
+
SELECT TO_TIMESTAMP('#{date}', 'YYYY-MM-DD HH24:MI:SS.FF') FROM dual
|
97
|
+
EOS
|
98
|
+
assert_equal(Time.local(*date.scanf("%d-%d-%d %d:%d:%d.%06d")), row[0])
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_timestamp_out_bind
|
104
|
+
cursor = @conn.parse(<<-EOS)
|
105
|
+
BEGIN
|
106
|
+
:out := TO_TIMESTAMP(:in, 'YYYY-MM-DD HH24:MI:SS.FF');
|
107
|
+
END;
|
108
|
+
EOS
|
109
|
+
cursor.bind_param(:out, nil, DateTime)
|
110
|
+
cursor.bind_param(:in, nil, String, 36)
|
111
|
+
['2005-06-01 00:00:00.999999000',
|
112
|
+
'2005-12-31 23:59:59.999999000',
|
113
|
+
'2006-01-01 00:00:00.000000000'].each do |date|
|
114
|
+
cursor[:in] = date
|
115
|
+
cursor.exec
|
116
|
+
assert_equal(string_to_datetime(date), cursor[:out])
|
117
|
+
end
|
118
|
+
cursor.close
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_timestamp_in_bind
|
122
|
+
cursor = @conn.parse(<<-EOS)
|
123
|
+
BEGIN
|
124
|
+
:out := TO_CHAR(:in, 'YYYY-MM-DD HH24:MI:SS.FF');
|
125
|
+
END;
|
126
|
+
EOS
|
127
|
+
cursor.bind_param(:out, nil, String, 33)
|
128
|
+
cursor.bind_param(:in, nil, DateTime)
|
129
|
+
['2005-06-01 00:00:00.999999000',
|
130
|
+
'2005-12-31 23:59:59.999999000',
|
131
|
+
'2006-01-01 00:00:00.000000000'].each do |date|
|
132
|
+
cursor[:in] = string_to_datetime(date)
|
133
|
+
cursor.exec
|
134
|
+
assert_equal(date, cursor[:out])
|
135
|
+
end
|
136
|
+
cursor.close
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_timestamp_tz_select
|
140
|
+
['2005-06-01 00:00:00.999999000 +00:00',
|
141
|
+
'2005-12-31 23:59:59.999999000 +08:30',
|
142
|
+
'2006-01-01 00:00:00.000000000 -08:30'].each do |date|
|
143
|
+
@conn.exec(<<-EOS) do |row|
|
144
|
+
SELECT TO_TIMESTAMP_TZ('#{date}', 'YYYY-MM-DD HH24:MI:SS.FF TZH:TZM') FROM dual
|
145
|
+
EOS
|
146
|
+
expected_val = begin
|
147
|
+
string_to_time(date)
|
148
|
+
rescue
|
149
|
+
string_to_datetime(date)
|
150
|
+
end
|
151
|
+
assert_equal(expected_val, row[0])
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
def test_timestamp_tz_out_bind
|
157
|
+
cursor = @conn.parse(<<-EOS)
|
158
|
+
BEGIN
|
159
|
+
:out := TO_TIMESTAMP_TZ(:in, 'YYYY-MM-DD HH24:MI:SS.FF TZH:TZM');
|
160
|
+
END;
|
161
|
+
EOS
|
162
|
+
cursor.bind_param(:out, nil, DateTime)
|
163
|
+
cursor.bind_param(:in, nil, String, 36)
|
164
|
+
['2005-06-01 00:00:00.999999000 -08:30',
|
165
|
+
'2005-12-31 23:59:59.999999000 +00:00',
|
166
|
+
'2006-01-01 00:00:00.000000000 +08:30'].each do |date|
|
167
|
+
cursor[:in] = date
|
168
|
+
cursor.exec
|
169
|
+
assert_equal(string_to_datetime(date), cursor[:out])
|
170
|
+
end
|
171
|
+
cursor.close
|
172
|
+
end
|
173
|
+
|
174
|
+
def test_timestamp_tz_in_bind
|
175
|
+
cursor = @conn.parse(<<-EOS)
|
176
|
+
BEGIN
|
177
|
+
:out := TO_CHAR(:in, 'YYYY-MM-DD HH24:MI:SS.FF TZH:TZM');
|
178
|
+
END;
|
179
|
+
EOS
|
180
|
+
cursor.bind_param(:out, nil, String, 36)
|
181
|
+
cursor.bind_param(:in, nil, DateTime)
|
182
|
+
['2005-06-01 00:00:00.999999999 +08:30',
|
183
|
+
'2005-12-31 23:59:59.999999000 -08:30',
|
184
|
+
'2006-01-01 00:00:00.000000000 +00:00'].each do |date|
|
185
|
+
cursor[:in] = string_to_datetime(date)
|
186
|
+
cursor.exec
|
187
|
+
assert_equal(date, cursor[:out])
|
188
|
+
end
|
189
|
+
cursor.close
|
190
|
+
end
|
191
|
+
|
192
|
+
def test_datetype_duck_typing
|
193
|
+
cursor = @conn.parse("BEGIN :out := :in; END;")
|
194
|
+
cursor.bind_param(:in, nil, DateTime)
|
195
|
+
cursor.bind_param(:out, nil, DateTime)
|
196
|
+
obj = Object.new
|
197
|
+
# test year, month, day
|
198
|
+
def obj.year; 2006; end
|
199
|
+
def obj.month; 12; end
|
200
|
+
def obj.day; 31; end
|
201
|
+
cursor[:in] = obj
|
202
|
+
cursor.exec
|
203
|
+
assert_equal(string_to_datetime('2006-12-31 00:00:00'), cursor[:out])
|
204
|
+
# test hour
|
205
|
+
def obj.hour; 23; end
|
206
|
+
cursor[:in] = obj
|
207
|
+
cursor.exec
|
208
|
+
assert_equal(string_to_datetime('2006-12-31 23:00:00'), cursor[:out])
|
209
|
+
# test min
|
210
|
+
def obj.min; 59; end
|
211
|
+
cursor[:in] = obj
|
212
|
+
cursor.exec
|
213
|
+
assert_equal(string_to_datetime('2006-12-31 23:59:00'), cursor[:out])
|
214
|
+
# test sec
|
215
|
+
def obj.sec; 59; end
|
216
|
+
cursor[:in] = obj
|
217
|
+
cursor.exec
|
218
|
+
assert_equal(string_to_datetime('2006-12-31 23:59:59'), cursor[:out])
|
219
|
+
|
220
|
+
# test sec_fraction
|
221
|
+
def obj.sec_fraction; DateTime.parse('0001-01-01 00:00:00.000001').sec_fraction * 999999 ; end
|
222
|
+
cursor[:in] = obj
|
223
|
+
cursor.exec
|
224
|
+
assert_equal(string_to_datetime('2006-12-31 23:59:59.999999'), cursor[:out])
|
225
|
+
# test utc_offset (Time)
|
226
|
+
def obj.utc_offset; @utc_offset; end
|
227
|
+
obj.instance_variable_set(:@utc_offset, 9 * 60 * 60)
|
228
|
+
cursor[:in] = obj
|
229
|
+
cursor.exec
|
230
|
+
assert_equal(string_to_datetime('2006-12-31 23:59:59.999999 +09:00'), cursor[:out])
|
231
|
+
obj.instance_variable_set(:@utc_offset, -5 * 60 * 60)
|
232
|
+
cursor[:in] = obj
|
233
|
+
cursor.exec
|
234
|
+
assert_equal(string_to_datetime('2006-12-31 23:59:59.999999 -05:00'), cursor[:out])
|
235
|
+
# test offset (DateTime)
|
236
|
+
def obj.offset; @offset; end
|
237
|
+
obj.instance_variable_set(:@offset, 9.to_r / 24)
|
238
|
+
cursor[:in] = obj
|
239
|
+
cursor.exec
|
240
|
+
assert_equal(string_to_datetime('2006-12-31 23:59:59.999999 +09:00'), cursor[:out])
|
241
|
+
obj.instance_variable_set(:@offset, -5.to_r / 24)
|
242
|
+
cursor[:in] = obj
|
243
|
+
cursor.exec
|
244
|
+
assert_equal(string_to_datetime('2006-12-31 23:59:59.999999 -05:00'), cursor[:out])
|
245
|
+
end
|
246
|
+
|
247
|
+
def test_timezone
|
248
|
+
begin
|
249
|
+
# temporarily change the mapping to test OCI8::BindType::Util.default_timezone.
|
250
|
+
assert_raise(ArgumentError) do
|
251
|
+
OCI8::BindType::Util.default_timezone = :invalid_value
|
252
|
+
end
|
253
|
+
|
254
|
+
=begin
|
255
|
+
[:local, :utc].each do |tz|
|
256
|
+
OCI8::BindType::Util.default_timezone = tz
|
257
|
+
@conn.exec("select sysdate, to_date('2008-01-02', 'yyyy-mm-dd') from dual") do |row|
|
258
|
+
row.each do |dt|
|
259
|
+
assert_kind_of(Time, dt)
|
260
|
+
assert_equal(tz, dt.utc? ? :utc : :local)
|
261
|
+
end
|
262
|
+
assert_equal(2008, row[1].year)
|
263
|
+
assert_equal(1, row[1].month)
|
264
|
+
assert_equal(2, row[1].day)
|
265
|
+
end
|
266
|
+
end
|
267
|
+
=end
|
268
|
+
ensure
|
269
|
+
OCI8::BindType::Util.default_timezone = :local
|
270
|
+
end
|
271
|
+
|
272
|
+
ses_tz = nil
|
273
|
+
@conn.exec('select sessiontimezone from dual') do |row|
|
274
|
+
ses_tz = row[0]
|
275
|
+
end
|
276
|
+
|
277
|
+
begin
|
278
|
+
['+09:00', '+00:00', '-05:00'].each do |tz|
|
279
|
+
@conn.exec("alter session set time_zone = '#{tz}'")
|
280
|
+
@conn.exec("select current_timestamp, sysdate, to_timestamp('2008-01-02', 'yyyy-mm-dd') from dual") do |row|
|
281
|
+
row.each do |dt|
|
282
|
+
case dt
|
283
|
+
when Time
|
284
|
+
assert_equal(tz, timezone_string(*((dt.utc_offset / 60).divmod 60)))
|
285
|
+
when DateTime
|
286
|
+
tz = tz.gsub(/:/, '') if RUBY_VERSION <= '1.8.5'
|
287
|
+
assert_equal(tz, dt.zone)
|
288
|
+
else
|
289
|
+
flunk "unexpedted type #{dt.class}"
|
290
|
+
end
|
291
|
+
end
|
292
|
+
assert_equal(2008, row[2].year)
|
293
|
+
assert_equal(1, row[2].month)
|
294
|
+
assert_equal(2, row[2].day)
|
295
|
+
end
|
296
|
+
end
|
297
|
+
ensure
|
298
|
+
@conn.exec("alter session set time_zone = '#{ses_tz}'")
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
def test_interval_ym_select
|
303
|
+
[['2006-01-01', '2004-03-01'],
|
304
|
+
['2006-01-01', '2005-03-01'],
|
305
|
+
['2006-01-01', '2006-03-01'],
|
306
|
+
['2006-01-01', '2007-03-01']
|
307
|
+
].each do |date1, date2|
|
308
|
+
@conn.exec(<<-EOS) do |row|
|
309
|
+
SELECT (TO_TIMESTAMP('#{date1}', 'YYYY-MM-DD')
|
310
|
+
- TO_TIMESTAMP('#{date2}', 'YYYY-MM-DD')) YEAR TO MONTH
|
311
|
+
FROM dual
|
312
|
+
EOS
|
313
|
+
assert_equal(DateTime.parse(date1), DateTime.parse(date2) >> row[0])
|
314
|
+
end
|
315
|
+
end
|
316
|
+
end
|
317
|
+
|
318
|
+
def test_interval_ym_out_bind
|
319
|
+
cursor = @conn.parse(<<-EOS)
|
320
|
+
DECLARE
|
321
|
+
ts1 TIMESTAMP;
|
322
|
+
ts2 TIMESTAMP;
|
323
|
+
BEGIN
|
324
|
+
ts1 := TO_TIMESTAMP(:in1, 'YYYY-MM-DD');
|
325
|
+
ts2 := TO_TIMESTAMP(:in2, 'YYYY-MM-DD');
|
326
|
+
:out := (ts1 - ts2) YEAR TO MONTH;
|
327
|
+
END;
|
328
|
+
EOS
|
329
|
+
cursor.bind_param(:out, nil, :interval_ym)
|
330
|
+
cursor.bind_param(:in1, nil, String, 36)
|
331
|
+
cursor.bind_param(:in2, nil, String, 36)
|
332
|
+
[['2006-01-01', '2004-03-01'],
|
333
|
+
['2006-01-01', '2005-03-01'],
|
334
|
+
['2006-01-01', '2006-03-01'],
|
335
|
+
['2006-01-01', '2007-03-01']
|
336
|
+
].each do |date1, date2|
|
337
|
+
cursor[:in1] = date1
|
338
|
+
cursor[:in2] = date2
|
339
|
+
cursor.exec
|
340
|
+
assert_equal(DateTime.parse(date1), DateTime.parse(date2) >> cursor[:out])
|
341
|
+
end
|
342
|
+
cursor.close
|
343
|
+
end
|
344
|
+
|
345
|
+
def test_interval_ym_in_bind
|
346
|
+
cursor = @conn.parse(<<-EOS)
|
347
|
+
DECLARE
|
348
|
+
ts1 TIMESTAMP;
|
349
|
+
BEGIN
|
350
|
+
ts1 := TO_TIMESTAMP(:in1, 'YYYY-MM-DD');
|
351
|
+
:out := TO_CHAR(ts1 + :in2, 'YYYY-MM-DD');
|
352
|
+
END;
|
353
|
+
EOS
|
354
|
+
cursor.bind_param(:out, nil, String, 36)
|
355
|
+
cursor.bind_param(:in1, nil, String, 36)
|
356
|
+
cursor.bind_param(:in2, nil, :interval_ym)
|
357
|
+
[['2006-01-01', -25],
|
358
|
+
['2006-01-01', -24],
|
359
|
+
['2006-01-01', -23],
|
360
|
+
['2006-01-01', -13],
|
361
|
+
['2006-01-01', -12],
|
362
|
+
['2006-01-01', -11],
|
363
|
+
['2006-01-01', +2],
|
364
|
+
['2006-01-01', -2],
|
365
|
+
['2006-01-01', +12]
|
366
|
+
].each do |date, interval|
|
367
|
+
cursor[:in1] = date
|
368
|
+
cursor[:in2] = interval
|
369
|
+
cursor.exec
|
370
|
+
assert_equal(DateTime.parse(date) >> interval, DateTime.parse(cursor[:out]))
|
371
|
+
end
|
372
|
+
cursor.close
|
373
|
+
end
|
374
|
+
|
375
|
+
def test_interval_ds_select
|
376
|
+
[['2006-01-01', '2004-03-01'],
|
377
|
+
['2006-01-01', '2005-03-01'],
|
378
|
+
['2006-01-01', '2006-03-01'],
|
379
|
+
['2006-01-01', '2007-03-01'],
|
380
|
+
['2006-01-01', '2006-01-01 23:00:00'],
|
381
|
+
['2006-01-01', '2006-01-01 00:59:00'],
|
382
|
+
['2006-01-01', '2006-01-01 00:00:59'],
|
383
|
+
['2006-01-01', '2006-01-01 00:00:00.999999'],
|
384
|
+
['2006-01-01', '2006-01-01 23:59:59.999999'],
|
385
|
+
['2006-01-01', '2005-12-31 23:00:00'],
|
386
|
+
['2006-01-01', '2005-12-31 00:59:00'],
|
387
|
+
['2006-01-01', '2005-12-31 00:00:59'],
|
388
|
+
['2006-01-01', '2005-12-31 00:00:00.999999'],
|
389
|
+
['2006-01-01', '2005-12-31 23:59:59.999999']
|
390
|
+
].each do |date1, date2|
|
391
|
+
@conn.exec(<<-EOS) do |row|
|
392
|
+
SELECT (TO_TIMESTAMP('#{date1}', 'YYYY-MM-DD HH24:MI:SS.FF')
|
393
|
+
- TO_TIMESTAMP('#{date2}', 'YYYY-MM-DD HH24:MI:SS.FF')) DAY(3) TO SECOND
|
394
|
+
FROM dual
|
395
|
+
EOS
|
396
|
+
assert_in_delta(string_to_time(date1) - string_to_time(date2), row[0], 0.0000000001)
|
397
|
+
end
|
398
|
+
end
|
399
|
+
end
|
400
|
+
|
401
|
+
def test_interval_ds_out_bind
|
402
|
+
cursor = @conn.parse(<<-EOS)
|
403
|
+
DECLARE
|
404
|
+
ts1 TIMESTAMP;
|
405
|
+
ts2 TIMESTAMP;
|
406
|
+
BEGIN
|
407
|
+
ts1 := TO_TIMESTAMP(:in1, 'YYYY-MM-DD HH24:MI:SS.FF');
|
408
|
+
ts2 := TO_TIMESTAMP(:in2, 'YYYY-MM-DD HH24:MI:SS.FF');
|
409
|
+
:out := (ts1 - ts2) DAY TO SECOND(9);
|
410
|
+
END;
|
411
|
+
EOS
|
412
|
+
cursor.bind_param(:out, nil, :interval_ds)
|
413
|
+
cursor.bind_param(:in1, nil, String, 36)
|
414
|
+
cursor.bind_param(:in2, nil, String, 36)
|
415
|
+
[['2006-01-01', '2004-03-01'],
|
416
|
+
['2006-01-01', '2005-03-01'],
|
417
|
+
['2006-01-01', '2006-03-01'],
|
418
|
+
['2006-01-01', '2007-03-01'],
|
419
|
+
['2006-01-01', '2006-01-01 23:00:00'],
|
420
|
+
['2006-01-01', '2006-01-01 00:59:00'],
|
421
|
+
['2006-01-01', '2006-01-01 00:00:59'],
|
422
|
+
['2006-01-01', '2006-01-01 00:00:00.999999'],
|
423
|
+
['2006-01-01', '2006-01-01 23:59:59.999999'],
|
424
|
+
['2006-01-01', '2005-12-31 23:00:00'],
|
425
|
+
['2006-01-01', '2005-12-31 00:59:00'],
|
426
|
+
['2006-01-01', '2005-12-31 00:00:59'],
|
427
|
+
['2006-01-01', '2005-12-31 00:00:00.999999'],
|
428
|
+
['2006-01-01', '2005-12-31 23:59:59.999999']
|
429
|
+
].each do |date1, date2|
|
430
|
+
cursor[:in1] = date1
|
431
|
+
cursor[:in2] = date2
|
432
|
+
cursor.exec
|
433
|
+
assert_in_delta(string_to_time(date1) - string_to_time(date2), cursor[:out], 0.0000000001)
|
434
|
+
end
|
435
|
+
cursor.close
|
436
|
+
end
|
437
|
+
|
438
|
+
def test_interval_ds_in_bind
|
439
|
+
cursor = @conn.parse(<<-EOS)
|
440
|
+
DECLARE
|
441
|
+
ts1 TIMESTAMP;
|
442
|
+
BEGIN
|
443
|
+
ts1 := TO_TIMESTAMP(:in1, 'YYYY-MM-DD HH24:MI:SS.FF');
|
444
|
+
:out := TO_CHAR(ts1 + :in2, 'YYYY-MM-DD HH24:MI:SS.FF');
|
445
|
+
END;
|
446
|
+
EOS
|
447
|
+
cursor.bind_param(:out, nil, String, 36)
|
448
|
+
cursor.bind_param(:in1, nil, String, 36)
|
449
|
+
cursor.bind_param(:in2, nil, :interval_ds)
|
450
|
+
[['2006-01-01', -22],
|
451
|
+
['2006-01-01', -10],
|
452
|
+
['2006-01-01', +2],
|
453
|
+
['2006-01-01', +12],
|
454
|
+
['2006-01-01', -1.to_r / 24], # one hour
|
455
|
+
['2006-01-01', -1.to_r / (24*60)], # one minute
|
456
|
+
['2006-01-01', -1.to_r / (24*60*60)], # one second
|
457
|
+
['2006-01-01', -999999.to_r / (24*60*60*1000000)], # 0.999999 seconds
|
458
|
+
['2006-01-01', +1.to_r / 24], # one hour
|
459
|
+
['2006-01-01', +1.to_r / (24*60)], # one minute
|
460
|
+
['2006-01-01', +1.to_r / (24*60*60)], # one second
|
461
|
+
['2006-01-01', +999999.to_r / (24*60*60*1000000)] # 0.999999 seconds
|
462
|
+
].each do |date, interval|
|
463
|
+
interval *= 86400
|
464
|
+
cursor[:in1] = date
|
465
|
+
cursor[:in2] = interval
|
466
|
+
cursor.exec
|
467
|
+
assert_equal(string_to_time(date) + interval, string_to_time(cursor[:out]))
|
468
|
+
end
|
469
|
+
cursor.close
|
470
|
+
end
|
471
|
+
|
472
|
+
def test_days_interval_ds_select
|
473
|
+
[['2006-01-01', '2004-03-01'],
|
474
|
+
['2006-01-01', '2005-03-01'],
|
475
|
+
['2006-01-01', '2006-03-01'],
|
476
|
+
['2006-01-01', '2007-03-01'],
|
477
|
+
['2006-01-01', '2006-01-01 23:00:00'],
|
478
|
+
['2006-01-01', '2006-01-01 00:59:00'],
|
479
|
+
['2006-01-01', '2006-01-01 00:00:59'],
|
480
|
+
['2006-01-01', '2006-01-01 00:00:00.999999'],
|
481
|
+
['2006-01-01', '2006-01-01 23:59:59.999999'],
|
482
|
+
['2006-01-01', '2005-12-31 23:00:00'],
|
483
|
+
['2006-01-01', '2005-12-31 00:59:00'],
|
484
|
+
['2006-01-01', '2005-12-31 00:00:59'],
|
485
|
+
['2006-01-01', '2005-12-31 00:00:00.999999'],
|
486
|
+
['2006-01-01', '2005-12-31 23:59:59.999999']
|
487
|
+
].each do |date1, date2|
|
488
|
+
begin
|
489
|
+
OCI8::BindType::IntervalDS.unit = :day
|
490
|
+
@conn.exec(<<-EOS) do |row|
|
491
|
+
SELECT (TO_TIMESTAMP('#{date1}', 'YYYY-MM-DD HH24:MI:SS.FF')
|
492
|
+
- TO_TIMESTAMP('#{date2}', 'YYYY-MM-DD HH24:MI:SS.FF')) DAY(3) TO SECOND
|
493
|
+
FROM dual
|
494
|
+
EOS
|
495
|
+
assert_equal(DateTime.parse(date1) - DateTime.parse(date2), row[0])
|
496
|
+
end
|
497
|
+
ensure
|
498
|
+
OCI8::BindType::IntervalDS.unit = :second
|
499
|
+
end
|
500
|
+
end
|
501
|
+
end
|
502
|
+
|
503
|
+
def test_days_interval_ds_out_bind
|
504
|
+
cursor = @conn.parse(<<-EOS)
|
505
|
+
DECLARE
|
506
|
+
ts1 TIMESTAMP;
|
507
|
+
ts2 TIMESTAMP;
|
508
|
+
BEGIN
|
509
|
+
ts1 := TO_TIMESTAMP(:in1, 'YYYY-MM-DD HH24:MI:SS.FF');
|
510
|
+
ts2 := TO_TIMESTAMP(:in2, 'YYYY-MM-DD HH24:MI:SS.FF');
|
511
|
+
:out := (ts1 - ts2) DAY TO SECOND(9);
|
512
|
+
END;
|
513
|
+
EOS
|
514
|
+
cursor.bind_param(:out, nil, :interval_ds)
|
515
|
+
cursor.bind_param(:in1, nil, String, 36)
|
516
|
+
cursor.bind_param(:in2, nil, String, 36)
|
517
|
+
[['2006-01-01', '2004-03-01'],
|
518
|
+
['2006-01-01', '2005-03-01'],
|
519
|
+
['2006-01-01', '2006-03-01'],
|
520
|
+
['2006-01-01', '2007-03-01'],
|
521
|
+
['2006-01-01', '2006-01-01 23:00:00'],
|
522
|
+
['2006-01-01', '2006-01-01 00:59:00'],
|
523
|
+
['2006-01-01', '2006-01-01 00:00:59'],
|
524
|
+
['2006-01-01', '2006-01-01 00:00:00.999999'],
|
525
|
+
['2006-01-01', '2006-01-01 23:59:59.999999'],
|
526
|
+
['2006-01-01', '2005-12-31 23:00:00'],
|
527
|
+
['2006-01-01', '2005-12-31 00:59:00'],
|
528
|
+
['2006-01-01', '2005-12-31 00:00:59'],
|
529
|
+
['2006-01-01', '2005-12-31 00:00:00.999999'],
|
530
|
+
['2006-01-01', '2005-12-31 23:59:59.999999']
|
531
|
+
].each do |date1, date2|
|
532
|
+
begin
|
533
|
+
OCI8::BindType::IntervalDS.unit = :day
|
534
|
+
cursor[:in1] = date1
|
535
|
+
cursor[:in2] = date2
|
536
|
+
cursor.exec
|
537
|
+
assert_equal(DateTime.parse(date1) - DateTime.parse(date2), cursor[:out])
|
538
|
+
ensure
|
539
|
+
OCI8::BindType::IntervalDS.unit = :second
|
540
|
+
end
|
541
|
+
end
|
542
|
+
cursor.close
|
543
|
+
end
|
544
|
+
|
545
|
+
def test_days_interval_ds_in_bind
|
546
|
+
cursor = @conn.parse(<<-EOS)
|
547
|
+
DECLARE
|
548
|
+
ts1 TIMESTAMP;
|
549
|
+
BEGIN
|
550
|
+
ts1 := TO_TIMESTAMP(:in1, 'YYYY-MM-DD');
|
551
|
+
:out := TO_CHAR(ts1 + :in2, 'YYYY-MM-DD HH24:MI:SS.FF');
|
552
|
+
END;
|
553
|
+
EOS
|
554
|
+
cursor.bind_param(:out, nil, String, 36)
|
555
|
+
cursor.bind_param(:in1, nil, String, 36)
|
556
|
+
cursor.bind_param(:in2, nil, :interval_ds)
|
557
|
+
[['2006-01-01', -22],
|
558
|
+
['2006-01-01', -10],
|
559
|
+
['2006-01-01', +2],
|
560
|
+
['2006-01-01', +12],
|
561
|
+
['2006-01-01', -1.to_r / 24], # one hour
|
562
|
+
['2006-01-01', -1.to_r / (24*60)], # one minute
|
563
|
+
['2006-01-01', -1.to_r / (24*60*60)], # one second
|
564
|
+
['2006-01-01', -999999.to_r / (24*60*60*1000000)], # 0.999999 seconds
|
565
|
+
['2006-01-01', +1.to_r / 24], # one hour
|
566
|
+
['2006-01-01', +1.to_r / (24*60)], # one minute
|
567
|
+
['2006-01-01', +1.to_r / (24*60*60)], # one second
|
568
|
+
['2006-01-01', +999999.to_r / (24*60*60*1000000)] # 0.999999 seconds
|
569
|
+
].each do |date, interval|
|
570
|
+
begin
|
571
|
+
OCI8::BindType::IntervalDS.unit = :day
|
572
|
+
cursor[:in1] = date
|
573
|
+
cursor[:in2] = interval
|
574
|
+
cursor.exec
|
575
|
+
assert_equal(DateTime.parse(date) + interval, DateTime.parse(cursor[:out]))
|
576
|
+
ensure
|
577
|
+
OCI8::BindType::IntervalDS.unit = :second
|
578
|
+
end
|
579
|
+
end
|
580
|
+
end
|
581
|
+
end # TestOCI8
|