odbc-rails 1.2
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.
- data/AUTHORS +16 -0
- data/COPYING +21 -0
- data/ChangeLog +89 -0
- data/LICENSE +5 -0
- data/NEWS +12 -0
- data/README +282 -0
- data/lib/active_record/connection_adapters/odbc_adapter.rb +1792 -0
- data/lib/active_record/vendor/odbcext_db2.rb +87 -0
- data/lib/active_record/vendor/odbcext_informix.rb +132 -0
- data/lib/active_record/vendor/odbcext_informix_col.rb +45 -0
- data/lib/active_record/vendor/odbcext_ingres.rb +156 -0
- data/lib/active_record/vendor/odbcext_microsoftsqlserver.rb +185 -0
- data/lib/active_record/vendor/odbcext_microsoftsqlserver_col.rb +40 -0
- data/lib/active_record/vendor/odbcext_mysql.rb +136 -0
- data/lib/active_record/vendor/odbcext_oracle.rb +220 -0
- data/lib/active_record/vendor/odbcext_postgresql.rb +179 -0
- data/lib/active_record/vendor/odbcext_progress.rb +139 -0
- data/lib/active_record/vendor/odbcext_progress89.rb +259 -0
- data/lib/active_record/vendor/odbcext_sybase.rb +212 -0
- data/lib/active_record/vendor/odbcext_sybase_col.rb +49 -0
- data/lib/active_record/vendor/odbcext_virtuoso.rb +146 -0
- data/lib/odbc_adapter.rb +28 -0
- data/support/lib/active_record/connection_adapters/abstract/schema_definitions.rb +259 -0
- data/support/odbc_rails.diff +707 -0
- data/support/pack_odbc.rb +119 -0
- data/support/rake/rails_plugin_package_task.rb +212 -0
- data/support/test/base_test.rb +1349 -0
- data/support/test/migration_test.rb +566 -0
- data/test/connections/native_odbc/connection.rb +95 -0
- data/test/fixtures/db_definitions/db2.drop.sql +30 -0
- data/test/fixtures/db_definitions/db2.sql +217 -0
- data/test/fixtures/db_definitions/db22.drop.sql +2 -0
- data/test/fixtures/db_definitions/db22.sql +5 -0
- data/test/fixtures/db_definitions/informix.drop.sql +30 -0
- data/test/fixtures/db_definitions/informix.sql +205 -0
- data/test/fixtures/db_definitions/informix2.drop.sql +2 -0
- data/test/fixtures/db_definitions/informix2.sql +5 -0
- data/test/fixtures/db_definitions/ingres.drop.sql +62 -0
- data/test/fixtures/db_definitions/ingres.sql +232 -0
- data/test/fixtures/db_definitions/ingres2.drop.sql +2 -0
- data/test/fixtures/db_definitions/ingres2.sql +5 -0
- data/test/fixtures/db_definitions/mysql.drop.sql +30 -0
- data/test/fixtures/db_definitions/mysql.sql +219 -0
- data/test/fixtures/db_definitions/mysql2.drop.sql +2 -0
- data/test/fixtures/db_definitions/mysql2.sql +5 -0
- data/test/fixtures/db_definitions/oracle_odbc.drop.sql +64 -0
- data/test/fixtures/db_definitions/oracle_odbc.sql +257 -0
- data/test/fixtures/db_definitions/oracle_odbc2.drop.sql +2 -0
- data/test/fixtures/db_definitions/oracle_odbc2.sql +6 -0
- data/test/fixtures/db_definitions/progress.drop.sql +61 -0
- data/test/fixtures/db_definitions/progress.sql +234 -0
- data/test/fixtures/db_definitions/progress2.drop.sql +2 -0
- data/test/fixtures/db_definitions/progress2.sql +6 -0
- data/test/fixtures/db_definitions/sqlserver.drop.sql +30 -0
- data/test/fixtures/db_definitions/sqlserver.sql +203 -0
- data/test/fixtures/db_definitions/sqlserver2.drop.sql +2 -0
- data/test/fixtures/db_definitions/sqlserver2.sql +5 -0
- data/test/fixtures/db_definitions/sybase.drop.sql +31 -0
- data/test/fixtures/db_definitions/sybase.sql +204 -0
- data/test/fixtures/db_definitions/sybase2.drop.sql +4 -0
- data/test/fixtures/db_definitions/sybase2.sql +5 -0
- data/test/fixtures/db_definitions/virtuoso.drop.sql +30 -0
- data/test/fixtures/db_definitions/virtuoso.sql +200 -0
- data/test/fixtures/db_definitions/virtuoso2.drop.sql +2 -0
- data/test/fixtures/db_definitions/virtuoso2.sql +5 -0
- metadata +149 -0
@@ -0,0 +1,707 @@
|
|
1
|
+
Index: lib/active_record/connection_adapters/abstract/schema_definitions.rb
|
2
|
+
===================================================================
|
3
|
+
--- lib/active_record/connection_adapters/abstract/schema_definitions.rb (revision 1)
|
4
|
+
+++ lib/active_record/connection_adapters/abstract/schema_definitions.rb (working copy)
|
5
|
+
@@ -195,7 +195,8 @@
|
6
|
+
# Appends a primary key definition to the table definition.
|
7
|
+
# Can be called multiple times, but this is probably not a good idea.
|
8
|
+
def primary_key(name)
|
9
|
+
- column(name, native[:primary_key])
|
10
|
+
+ # column(name, native[:primary_key])
|
11
|
+
+ column(name, :primary_key)
|
12
|
+
end
|
13
|
+
|
14
|
+
# Returns a ColumnDefinition for the column with name +name+.
|
15
|
+
Index: test/base_test.rb
|
16
|
+
===================================================================
|
17
|
+
--- test/base_test.rb (revision 1)
|
18
|
+
+++ test/base_test.rb (working copy)
|
19
|
+
@@ -44,7 +44,7 @@
|
20
|
+
end
|
21
|
+
|
22
|
+
class BasicsTest < Test::Unit::TestCase
|
23
|
+
- fixtures :topics, :companies, :developers, :projects, :computers
|
24
|
+
+ fixtures :topics, :companies, :developers, :projects, :computers, :accounts
|
25
|
+
|
26
|
+
def test_table_exists
|
27
|
+
assert !NonExistentTable.table_exists?
|
28
|
+
@@ -297,7 +297,15 @@
|
29
|
+
Time, Topic.find(1).last_read,
|
30
|
+
"The last_read attribute should be of the Time class"
|
31
|
+
)
|
32
|
+
+ elsif current_adapter?(:ODBCAdapter) && [:ingres, :microsoftsqlserver, :oracle].include?(ActiveRecord::Base.connection.dbmsName)
|
33
|
+
+ # Above databases don't have a pure date type. (They have a datetime-like type).
|
34
|
+
+ assert_kind_of(
|
35
|
+
+ Time, Topic.find(1).last_read,
|
36
|
+
+ "The last_read attribute should be of the Time class"
|
37
|
+
+ )
|
38
|
+
else
|
39
|
+
+ # ODBCAdapter fails against SQL Server because topics.last_read is
|
40
|
+
+ # defined as a datetime column, which is returned as a Ruby Time object.
|
41
|
+
assert_kind_of(
|
42
|
+
Date, Topic.find(1).last_read,
|
43
|
+
"The last_read attribute should be of the Date class"
|
44
|
+
@@ -563,7 +571,12 @@
|
45
|
+
|
46
|
+
def test_default_values_on_empty_strings
|
47
|
+
topic = Topic.new
|
48
|
+
- topic.approved = nil
|
49
|
+
+ #Sybase does not allow nulls in boolean columns
|
50
|
+
+ if current_adapter?(:ODBCAdapter) && ActiveRecord::Base.connection.dbmsName == :sybase
|
51
|
+
+ topic.approved = false
|
52
|
+
+ else
|
53
|
+
+ topic.approved = nil
|
54
|
+
+ end
|
55
|
+
topic.last_read = nil
|
56
|
+
|
57
|
+
topic.save
|
58
|
+
@@ -572,7 +585,8 @@
|
59
|
+
assert_nil topic.last_read
|
60
|
+
|
61
|
+
# Sybase adapter does not allow nulls in boolean columns
|
62
|
+
- if current_adapter?(:SybaseAdapter)
|
63
|
+
+ if current_adapter?(:SybaseAdapter) ||
|
64
|
+
+ current_adapter?(:ODBCAdapter) && ActiveRecord::Base.connection.dbmsName == :sybase
|
65
|
+
assert topic.approved == false
|
66
|
+
else
|
67
|
+
assert_nil topic.approved
|
68
|
+
@@ -733,7 +747,12 @@
|
69
|
+
|
70
|
+
def test_attributes_on_dummy_time
|
71
|
+
# Oracle and SQL Server do not have a TIME datatype.
|
72
|
+
- return true if current_adapter?(:SQLServerAdapter) || current_adapter?(:OracleAdapter)
|
73
|
+
+ return true if current_adapter?(:SQLServerAdapter) ||
|
74
|
+
+ current_adapter?(:OracleAdapter)
|
75
|
+
+ if current_adapter?(:ODBCAdapter)
|
76
|
+
+ # Check for databases which don't have a true TIME datatype
|
77
|
+
+ return true if [:ingres, :oracle].include?(ActiveRecord::Base.connection.dbmsName)
|
78
|
+
+ end
|
79
|
+
|
80
|
+
attributes = {
|
81
|
+
"bonus_time" => "5:42:00AM"
|
82
|
+
@@ -965,7 +984,12 @@
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_quote
|
86
|
+
- author_name = "\\ \001 ' \n \\n \""
|
87
|
+
+ if current_adapter?(:ODBCAdapter) && [:informix, :sybase].include?(ActiveRecord::Base.connection.dbmsName)
|
88
|
+
+ #Informix and Sybase only allow printable characters in VARCHAR columns.
|
89
|
+
+ author_name = "\\ \041 ' \n \\n \""
|
90
|
+
+ else
|
91
|
+
+ author_name = "\\ \001 ' \n \\n \""
|
92
|
+
+ end
|
93
|
+
topic = Topic.create('author_name' => author_name)
|
94
|
+
assert_equal author_name, Topic.find(topic.id).author_name
|
95
|
+
end
|
96
|
+
@@ -1204,14 +1228,22 @@
|
97
|
+
assert xml.include?(%(<content>Have a nice day</content>))
|
98
|
+
assert xml.include?(%(<author-email-address>david@loudthinking.com</author-email-address>))
|
99
|
+
assert xml.include?(%(<parent-id></parent-id>))
|
100
|
+
- if current_adapter?(:SybaseAdapter) or current_adapter?(:SQLServerAdapter)
|
101
|
+
+ # Following databases don't have a true date type, only a composite datetime type
|
102
|
+
+ if current_adapter?(:SybaseAdapter) or current_adapter?(:SQLServerAdapter) or
|
103
|
+
+ current_adapter?(:ODBCAdapter) &&
|
104
|
+
+ [:ingres,:oracle,:microsoftsqlserver].include?(ActiveRecord::Base.connection.dbmsName)
|
105
|
+
assert xml.include?(%(<last-read type="datetime">#{last_read_in_current_timezone}</last-read>))
|
106
|
+
else
|
107
|
+
assert xml.include?(%(<last-read type="date">2004-04-15</last-read>))
|
108
|
+
end
|
109
|
+
- # Oracle and DB2 don't have true boolean or time-only fields
|
110
|
+
+ # Following databases don't have a true boolean type
|
111
|
+
+ unless current_adapter?(:OracleAdapter) || current_adapter?(:DB2Adapter) ||
|
112
|
+
+ current_adapter?(:ODBCAdapter) &&
|
113
|
+
+ [:ingres,:virtuoso,:oracle,:mysql,:db2].include?(ActiveRecord::Base.connection.dbmsName)
|
114
|
+
+ assert xml.include?(%(<approved type="boolean">false</approved>)), "Approved should be a boolean"
|
115
|
+
+ end
|
116
|
+
+ # Oracle and DB2 don't have a true time-only field
|
117
|
+
unless current_adapter?(:OracleAdapter) || current_adapter?(:DB2Adapter)
|
118
|
+
- assert xml.include?(%(<approved type="boolean">false</approved>)), "Approved should be a boolean"
|
119
|
+
assert xml.include?(%(<bonus-time type="datetime">#{bonus_time_in_current_timezone}</bonus-time>))
|
120
|
+
end
|
121
|
+
end
|
122
|
+
Index: test/fixtures/db_definitions/db2.sql
|
123
|
+
===================================================================
|
124
|
+
--- test/fixtures/db_definitions/db2.sql (revision 1)
|
125
|
+
+++ test/fixtures/db_definitions/db2.sql (working copy)
|
126
|
+
@@ -152,7 +152,7 @@
|
127
|
+
CREATE TABLE computers (
|
128
|
+
id INT GENERATED BY DEFAULT AS IDENTITY (START WITH 10000),
|
129
|
+
developer INT NOT NULL,
|
130
|
+
- extendedWarranty INT NOT NULL
|
131
|
+
+ "extendedWarranty" INT NOT NULL
|
132
|
+
);
|
133
|
+
|
134
|
+
CREATE TABLE posts (
|
135
|
+
Index: test/fixtures/db_definitions/mysql.sql
|
136
|
+
===================================================================
|
137
|
+
--- test/fixtures/db_definitions/mysql.sql (revision 1)
|
138
|
+
+++ test/fixtures/db_definitions/mysql.sql (working copy)
|
139
|
+
@@ -51,7 +51,7 @@
|
140
|
+
CREATE TABLE `projects` (
|
141
|
+
`id` int(11) NOT NULL auto_increment,
|
142
|
+
`name` varchar(100) default NULL,
|
143
|
+
- `type` VARCHAR(255) NOT NULL,
|
144
|
+
+ `type` VARCHAR(255) default NULL,
|
145
|
+
PRIMARY KEY (`id`)
|
146
|
+
) TYPE=InnoDB;
|
147
|
+
|
148
|
+
@@ -131,7 +131,7 @@
|
149
|
+
) TYPE=InnoDB;
|
150
|
+
|
151
|
+
CREATE TABLE `people` (
|
152
|
+
- `id` INTEGER NOT NULL PRIMARY KEY,
|
153
|
+
+ `id` INTEGER NOT NULL auto_increment PRIMARY KEY,
|
154
|
+
`first_name` VARCHAR(40) NOT NULL,
|
155
|
+
`lock_version` INTEGER NOT NULL DEFAULT 0
|
156
|
+
) TYPE=InnoDB;
|
157
|
+
Index: test/fixtures/db_definitions/sybase.sql
|
158
|
+
===================================================================
|
159
|
+
--- test/fixtures/db_definitions/sybase.sql (revision 1)
|
160
|
+
+++ test/fixtures/db_definitions/sybase.sql (working copy)
|
161
|
+
@@ -1,16 +1,16 @@
|
162
|
+
CREATE TABLE accounts (
|
163
|
+
- id numeric(9,0) IDENTITY PRIMARY KEY,
|
164
|
+
+ id int IDENTITY PRIMARY KEY,
|
165
|
+
firm_id int NULL,
|
166
|
+
credit_limit int NULL
|
167
|
+
)
|
168
|
+
|
169
|
+
CREATE TABLE funny_jokes (
|
170
|
+
-id numeric(9,0) IDENTITY PRIMARY KEY,
|
171
|
+
+id int IDENTITY PRIMARY KEY,
|
172
|
+
name varchar(50) NULL
|
173
|
+
)
|
174
|
+
|
175
|
+
CREATE TABLE companies (
|
176
|
+
- id numeric(9,0) IDENTITY PRIMARY KEY,
|
177
|
+
+ id int IDENTITY PRIMARY KEY,
|
178
|
+
type varchar(50) NULL,
|
179
|
+
ruby_type varchar(50) NULL,
|
180
|
+
firm_id int NULL,
|
181
|
+
@@ -21,13 +21,13 @@
|
182
|
+
|
183
|
+
|
184
|
+
CREATE TABLE topics (
|
185
|
+
- id numeric(9,0) IDENTITY PRIMARY KEY,
|
186
|
+
+ id int IDENTITY PRIMARY KEY,
|
187
|
+
title varchar(255) NULL,
|
188
|
+
author_name varchar(255) NULL,
|
189
|
+
author_email_address varchar(255) NULL,
|
190
|
+
written_on datetime NULL,
|
191
|
+
bonus_time time NULL,
|
192
|
+
- last_read datetime NULL,
|
193
|
+
+ last_read date NULL,
|
194
|
+
content varchar(255) NULL,
|
195
|
+
approved bit default 1,
|
196
|
+
replies_count int default 0,
|
197
|
+
@@ -36,7 +36,7 @@
|
198
|
+
)
|
199
|
+
|
200
|
+
CREATE TABLE developers (
|
201
|
+
- id numeric(9,0) IDENTITY PRIMARY KEY,
|
202
|
+
+ id int IDENTITY PRIMARY KEY,
|
203
|
+
name varchar(100) NULL,
|
204
|
+
salary int default 70000,
|
205
|
+
created_at datetime NULL,
|
206
|
+
@@ -44,7 +44,7 @@
|
207
|
+
)
|
208
|
+
|
209
|
+
CREATE TABLE projects (
|
210
|
+
- id numeric(9,0) IDENTITY PRIMARY KEY,
|
211
|
+
+ id int IDENTITY PRIMARY KEY,
|
212
|
+
name varchar(100) NULL,
|
213
|
+
type varchar(255) NULL
|
214
|
+
)
|
215
|
+
@@ -57,14 +57,14 @@
|
216
|
+
)
|
217
|
+
|
218
|
+
CREATE TABLE orders (
|
219
|
+
- id numeric(9,0) IDENTITY PRIMARY KEY,
|
220
|
+
+ id int IDENTITY PRIMARY KEY,
|
221
|
+
name varchar(100) NULL,
|
222
|
+
billing_customer_id int NULL,
|
223
|
+
shipping_customer_id int NULL
|
224
|
+
)
|
225
|
+
|
226
|
+
CREATE TABLE customers (
|
227
|
+
- id numeric(9,0) IDENTITY PRIMARY KEY,
|
228
|
+
+ id int IDENTITY PRIMARY KEY,
|
229
|
+
name varchar(100) NULL,
|
230
|
+
balance int default 0,
|
231
|
+
address_street varchar(100) NULL,
|
232
|
+
@@ -74,7 +74,7 @@
|
233
|
+
)
|
234
|
+
|
235
|
+
CREATE TABLE movies (
|
236
|
+
- movieid numeric(9,0) IDENTITY PRIMARY KEY,
|
237
|
+
+ movieid int IDENTITY PRIMARY KEY,
|
238
|
+
name varchar(100) NULL
|
239
|
+
)
|
240
|
+
|
241
|
+
@@ -84,28 +84,28 @@
|
242
|
+
)
|
243
|
+
|
244
|
+
CREATE TABLE booleantests (
|
245
|
+
- id numeric(9,0) IDENTITY PRIMARY KEY,
|
246
|
+
+ id int IDENTITY PRIMARY KEY,
|
247
|
+
value int NULL
|
248
|
+
)
|
249
|
+
|
250
|
+
CREATE TABLE auto_id_tests (
|
251
|
+
- auto_id numeric(9,0) IDENTITY PRIMARY KEY,
|
252
|
+
+ auto_id int IDENTITY PRIMARY KEY,
|
253
|
+
value int NULL
|
254
|
+
)
|
255
|
+
|
256
|
+
CREATE TABLE entrants (
|
257
|
+
- id numeric(9,0) IDENTITY PRIMARY KEY,
|
258
|
+
+ id int IDENTITY PRIMARY KEY,
|
259
|
+
name varchar(255) NOT NULL,
|
260
|
+
course_id int NOT NULL
|
261
|
+
)
|
262
|
+
|
263
|
+
CREATE TABLE colnametests (
|
264
|
+
- id numeric(9,0) IDENTITY PRIMARY KEY,
|
265
|
+
+ id int IDENTITY PRIMARY KEY,
|
266
|
+
[references] int NOT NULL
|
267
|
+
)
|
268
|
+
|
269
|
+
CREATE TABLE mixins (
|
270
|
+
- id numeric(9,0) IDENTITY PRIMARY KEY,
|
271
|
+
+ id int IDENTITY PRIMARY KEY,
|
272
|
+
parent_id int NULL,
|
273
|
+
pos int NULL,
|
274
|
+
created_at datetime NULL,
|
275
|
+
@@ -117,30 +117,30 @@
|
276
|
+
)
|
277
|
+
|
278
|
+
CREATE TABLE people (
|
279
|
+
- id numeric(9,0) IDENTITY PRIMARY KEY,
|
280
|
+
+ id int IDENTITY PRIMARY KEY,
|
281
|
+
first_name varchar(40) NOT NULL,
|
282
|
+
lock_version int DEFAULT 0
|
283
|
+
)
|
284
|
+
|
285
|
+
CREATE TABLE readers (
|
286
|
+
- id numeric(9,0) IDENTITY PRIMARY KEY,
|
287
|
+
+ id int IDENTITY PRIMARY KEY,
|
288
|
+
post_id int NOT NULL,
|
289
|
+
person_id int NOT NULL
|
290
|
+
)
|
291
|
+
|
292
|
+
CREATE TABLE binaries (
|
293
|
+
- id numeric(9,0) IDENTITY PRIMARY KEY,
|
294
|
+
+ id int IDENTITY PRIMARY KEY,
|
295
|
+
data image NULL
|
296
|
+
)
|
297
|
+
|
298
|
+
CREATE TABLE computers (
|
299
|
+
- id numeric(9,0) IDENTITY PRIMARY KEY,
|
300
|
+
+ id int IDENTITY PRIMARY KEY,
|
301
|
+
developer int NOT NULL,
|
302
|
+
extendedWarranty int NOT NULL
|
303
|
+
)
|
304
|
+
|
305
|
+
CREATE TABLE posts (
|
306
|
+
- id numeric(9,0) IDENTITY PRIMARY KEY,
|
307
|
+
+ id int IDENTITY PRIMARY KEY,
|
308
|
+
author_id int NULL,
|
309
|
+
title varchar(255) NOT NULL,
|
310
|
+
body varchar(2048) NOT NULL,
|
311
|
+
@@ -148,25 +148,25 @@
|
312
|
+
)
|
313
|
+
|
314
|
+
CREATE TABLE comments (
|
315
|
+
- id numeric(9,0) IDENTITY PRIMARY KEY,
|
316
|
+
+ id int IDENTITY PRIMARY KEY,
|
317
|
+
post_id int NOT NULL,
|
318
|
+
body varchar(2048) NOT NULL,
|
319
|
+
type varchar(255) NOT NULL
|
320
|
+
)
|
321
|
+
|
322
|
+
CREATE TABLE authors (
|
323
|
+
- id numeric(9,0) IDENTITY PRIMARY KEY,
|
324
|
+
+ id int IDENTITY PRIMARY KEY,
|
325
|
+
name varchar(255) NOT NULL
|
326
|
+
)
|
327
|
+
|
328
|
+
CREATE TABLE tasks (
|
329
|
+
- id numeric(9,0) IDENTITY PRIMARY KEY,
|
330
|
+
+ id int IDENTITY PRIMARY KEY,
|
331
|
+
starting datetime NULL,
|
332
|
+
ending datetime NULL
|
333
|
+
)
|
334
|
+
|
335
|
+
CREATE TABLE categories (
|
336
|
+
- id numeric(9,0) IDENTITY PRIMARY KEY,
|
337
|
+
+ id int IDENTITY PRIMARY KEY,
|
338
|
+
name varchar(255) NOT NULL,
|
339
|
+
type varchar(255) NOT NULL
|
340
|
+
)
|
341
|
+
@@ -177,25 +177,25 @@
|
342
|
+
)
|
343
|
+
|
344
|
+
CREATE TABLE fk_test_has_pk (
|
345
|
+
- id numeric(9,0) IDENTITY PRIMARY KEY
|
346
|
+
+ id int IDENTITY PRIMARY KEY
|
347
|
+
)
|
348
|
+
|
349
|
+
CREATE TABLE fk_test_has_fk (
|
350
|
+
- id numeric(9,0) PRIMARY KEY,
|
351
|
+
- fk_id numeric(9,0) NOT NULL,
|
352
|
+
+ id int PRIMARY KEY,
|
353
|
+
+ fk_id int NOT NULL,
|
354
|
+
|
355
|
+
FOREIGN KEY (fk_id) REFERENCES fk_test_has_pk(id)
|
356
|
+
)
|
357
|
+
|
358
|
+
|
359
|
+
CREATE TABLE keyboards (
|
360
|
+
- key_number numeric(9,0) IDENTITY PRIMARY KEY,
|
361
|
+
+ key_number int IDENTITY PRIMARY KEY,
|
362
|
+
name varchar(50) NULL
|
363
|
+
)
|
364
|
+
|
365
|
+
--This table has an altered lock_version column name.
|
366
|
+
CREATE TABLE legacy_things (
|
367
|
+
- id numeric(9,0) IDENTITY PRIMARY KEY,
|
368
|
+
+ id int IDENTITY PRIMARY KEY,
|
369
|
+
tps_report_number int default NULL,
|
370
|
+
version int default 0,
|
371
|
+
)
|
372
|
+
Index: test/migration_test.rb
|
373
|
+
===================================================================
|
374
|
+
--- test/migration_test.rb (revision 1)
|
375
|
+
+++ test/migration_test.rb (working copy)
|
376
|
+
@@ -46,7 +46,14 @@
|
377
|
+
end
|
378
|
+
|
379
|
+
def test_add_index
|
380
|
+
- Person.connection.add_column "people", "last_name", :string
|
381
|
+
+ if current_adapter?(:ODBCAdapter) && ActiveRecord::Base.connection.dbmsName == :informix
|
382
|
+
+ # Index on (last_name, first_name) exceeds max. index width supported by Informix if
|
383
|
+
+ # both columns are created with a default width of 255, in which case
|
384
|
+
+ # Informix may return error -517: "The total size of the index is too large..."
|
385
|
+
+ Person.connection.add_column "people", "last_name", :string, {:limit => 40}
|
386
|
+
+ else
|
387
|
+
+ Person.connection.add_column "people", "last_name", :string
|
388
|
+
+ end
|
389
|
+
Person.connection.add_column "people", "administrator", :boolean
|
390
|
+
Person.connection.add_column "people", "key", :string
|
391
|
+
|
392
|
+
@@ -61,7 +68,8 @@
|
393
|
+
assert_nothing_raised { Person.connection.remove_index("people", :name => "key") }
|
394
|
+
|
395
|
+
# Sybase adapter does not support indexes on :boolean columns
|
396
|
+
- unless current_adapter?(:SybaseAdapter)
|
397
|
+
+ unless current_adapter?(:SybaseAdapter) ||
|
398
|
+
+ current_adapter?(:ODBCAdapter) && ActiveRecord::Base.connection.dbmsName == :sybase
|
399
|
+
assert_nothing_raised { Person.connection.add_index("people", %w(last_name first_name administrator), :name => "named_admin") }
|
400
|
+
assert_nothing_raised { Person.connection.remove_index("people", :name => "named_admin") }
|
401
|
+
end
|
402
|
+
@@ -109,6 +117,12 @@
|
403
|
+
# Oracle doesn't support native booleans
|
404
|
+
assert_equal true, two.default == 1
|
405
|
+
assert_equal false, three.default != 0
|
406
|
+
+ elsif current_adapter?(:ODBCAdapter) &&
|
407
|
+
+ [:informix, :ingres, :virtuoso, :oracle, :mysql, :microsoftsqlserver].include?(ActiveRecord::Base.connection.dbmsName)
|
408
|
+
+ # Above databases/ODBC drivers don't support native booleans.
|
409
|
+
+ # They use an integer type instead.
|
410
|
+
+ assert_equal true, two.default == 1
|
411
|
+
+ assert_equal false, three.default != 0
|
412
|
+
else
|
413
|
+
assert_equal true, two.default
|
414
|
+
assert_equal false, three.default
|
415
|
+
@@ -122,12 +136,14 @@
|
416
|
+
# SQL Server and Sybase will not allow you to add a NOT NULL column
|
417
|
+
# to a table without specifying a default value, so the
|
418
|
+
# following test must be skipped
|
419
|
+
- unless current_adapter?(:SQLServerAdapter) || current_adapter?(:SybaseAdapter)
|
420
|
+
+ unless current_adapter?(:SQLServerAdapter) || current_adapter?(:SybaseAdapter) ||
|
421
|
+
+ current_adapter?(:ODBCAdapter) && [:microsoftsqlserver, :sybase].include?(ActiveRecord::Base.connection.dbmsName)
|
422
|
+
def test_add_column_not_null_without_default
|
423
|
+
+
|
424
|
+
Person.connection.create_table :testings do |t|
|
425
|
+
- t.column :foo, :string
|
426
|
+
+ t.column :foo, :string
|
427
|
+
end
|
428
|
+
- Person.connection.add_column :testings, :bar, :string, :null => false
|
429
|
+
+ Person.connection.add_column :testings, :bar, :string, :null => false
|
430
|
+
|
431
|
+
assert_raises(ActiveRecord::StatementInvalid) do
|
432
|
+
Person.connection.execute "insert into testings (foo, bar) values ('hello', NULL)"
|
433
|
+
@@ -141,8 +157,14 @@
|
434
|
+
Person.connection.create_table :testings do |t|
|
435
|
+
t.column :foo, :string
|
436
|
+
end
|
437
|
+
- Person.connection.add_column :testings, :bar, :string, :null => false, :default => "default"
|
438
|
+
-
|
439
|
+
+ if current_adapter?(:ODBCAdapter) && [:ingres].include?(ActiveRecord::Base.connection.dbmsName)
|
440
|
+
+ # Ingres requires that if 'ALTER TABLE table ADD column' specifies a NOT NULL constraint,
|
441
|
+
+ # then 'WITH DEFAULT' must also be specified *without* a default value.
|
442
|
+
+ Person.connection.add_column :testings, :bar, :string, :null => false
|
443
|
+
+ else
|
444
|
+
+ Person.connection.add_column :testings, :bar, :string, :null => false, :default => "default"
|
445
|
+
+ end
|
446
|
+
+
|
447
|
+
assert_raises(ActiveRecord::StatementInvalid) do
|
448
|
+
Person.connection.execute "insert into testings (foo, bar) values ('hello', NULL)"
|
449
|
+
end
|
450
|
+
@@ -174,8 +196,12 @@
|
451
|
+
assert_equal Fixnum, bob.age.class
|
452
|
+
assert_equal Time, bob.birthday.class
|
453
|
+
|
454
|
+
- if current_adapter?(:SQLServerAdapter) || current_adapter?(:OracleAdapter) || current_adapter?(:SybaseAdapter)
|
455
|
+
- # SQL Server, Sybase, and Oracle don't differentiate between date/time
|
456
|
+
+ if current_adapter?(:SQLServerAdapter) ||
|
457
|
+
+ current_adapter?(:OracleAdapter) ||
|
458
|
+
+ current_adapter?(:SybaseAdapter) ||
|
459
|
+
+ (current_adapter?(:ODBCAdapter) &&
|
460
|
+
+ [:ingres, :oracle, :microsoftsqlserver].include?(ActiveRecord::Base.connection.dbmsName))
|
461
|
+
+ # SQL Server, Sybase, Oracle and Ingres don't differentiate between date/time
|
462
|
+
assert_equal Time, bob.favorite_day.class
|
463
|
+
else
|
464
|
+
assert_equal Date, bob.favorite_day.class
|
465
|
+
@@ -186,7 +212,7 @@
|
466
|
+
|
467
|
+
def test_add_remove_single_field_using_string_arguments
|
468
|
+
assert !Person.column_methods_hash.include?(:last_name)
|
469
|
+
-
|
470
|
+
+
|
471
|
+
ActiveRecord::Migration.add_column 'people', 'last_name', :string
|
472
|
+
|
473
|
+
Person.reset_column_information
|
474
|
+
@@ -212,94 +238,130 @@
|
475
|
+
assert !Person.column_methods_hash.include?(:last_name)
|
476
|
+
end
|
477
|
+
|
478
|
+
- def test_add_rename
|
479
|
+
- Person.delete_all
|
480
|
+
-
|
481
|
+
- begin
|
482
|
+
- Person.connection.add_column "people", "girlfriend", :string
|
483
|
+
- Person.create :girlfriend => 'bobette'
|
484
|
+
-
|
485
|
+
- Person.connection.rename_column "people", "girlfriend", "exgirlfriend"
|
486
|
+
-
|
487
|
+
- Person.reset_column_information
|
488
|
+
- bob = Person.find(:first)
|
489
|
+
-
|
490
|
+
- assert_equal "bobette", bob.exgirlfriend
|
491
|
+
- ensure
|
492
|
+
- Person.connection.remove_column("people", "girlfriend") rescue nil
|
493
|
+
+ # Ingres, Virtuoso:
|
494
|
+
+ # Neither supports renaming of columns. Skip test.
|
495
|
+
+ unless current_adapter?(:ODBCAdapter) &&
|
496
|
+
+ [:ingres, :virtuoso].include?(ActiveRecord::Base.connection.dbmsName)
|
497
|
+
+ def test_add_rename
|
498
|
+
+ Person.delete_all
|
499
|
+
+
|
500
|
+
+ begin
|
501
|
+
+ # Some DBs complain girlfriend column already exists on two consecutive add_column calls
|
502
|
+
+ unless current_adapter?(:ODBCAdapter) && [:informix, :oracle, :mysql, :microsoftsqlserver, :sybase].include?(ActiveRecord::Base.connection.dbmsName)
|
503
|
+
+ Person.connection.add_column "people", "girlfriend", :string
|
504
|
+
+ end
|
505
|
+
+ Person.connection.add_column "people", "girlfriend", :string, :limit => 40
|
506
|
+
+ Person.create :girlfriend => 'bobette'
|
507
|
+
+
|
508
|
+
+ Person.connection.rename_column "people", "girlfriend", "exgirlfriend"
|
509
|
+
+
|
510
|
+
+ Person.reset_column_information
|
511
|
+
+ bob = Person.find(:first)
|
512
|
+
+
|
513
|
+
+ assert_equal "bobette", bob.exgirlfriend
|
514
|
+
+ ensure
|
515
|
+
+ Person.connection.remove_column("people", "girlfriend") rescue nil
|
516
|
+
Person.connection.remove_column("people", "exgirlfriend") rescue nil
|
517
|
+
+ end
|
518
|
+
end
|
519
|
+
-
|
520
|
+
end
|
521
|
+
|
522
|
+
- def test_rename_column_using_symbol_arguments
|
523
|
+
- begin
|
524
|
+
- Person.connection.rename_column :people, :first_name, :nick_name
|
525
|
+
- Person.reset_column_information
|
526
|
+
- assert Person.column_names.include?("nick_name")
|
527
|
+
- ensure
|
528
|
+
- Person.connection.remove_column("people","nick_name")
|
529
|
+
- Person.connection.add_column("people","first_name", :string)
|
530
|
+
+ # Ingres and Virtuoso don't support renaming of columns. Skip test.
|
531
|
+
+ unless current_adapter?(:ODBCAdapter) && [:ingres, :virtuoso].include?(ActiveRecord::Base.connection.dbmsName)
|
532
|
+
+ def test_rename_column_using_symbol_arguments
|
533
|
+
+ begin
|
534
|
+
+ Person.connection.rename_column :people, :first_name, :nick_name
|
535
|
+
+ Person.reset_column_information
|
536
|
+
+ assert Person.column_names.include?("nick_name")
|
537
|
+
+ ensure
|
538
|
+
+ Person.connection.remove_column("people","nick_name")
|
539
|
+
+ Person.connection.add_column("people","first_name", :string)
|
540
|
+
+ end
|
541
|
+
end
|
542
|
+
end
|
543
|
+
-
|
544
|
+
- def test_rename_column
|
545
|
+
- begin
|
546
|
+
- Person.connection.rename_column "people", "first_name", "nick_name"
|
547
|
+
- Person.reset_column_information
|
548
|
+
- assert Person.column_names.include?("nick_name")
|
549
|
+
- ensure
|
550
|
+
- Person.connection.remove_column("people","nick_name")
|
551
|
+
- Person.connection.add_column("people","first_name", :string)
|
552
|
+
+
|
553
|
+
+ # Ingres and Virtuoso don't support renaming of columns. Skip test.
|
554
|
+
+ unless current_adapter?(:ODBCAdapter) && [:ingres, :virtuoso].include?(ActiveRecord::Base.connection.dbmsName)
|
555
|
+
+ def test_rename_column
|
556
|
+
+ begin
|
557
|
+
+ Person.connection.rename_column "people", "first_name", "nick_name"
|
558
|
+
+ Person.reset_column_information
|
559
|
+
+ assert Person.column_names.include?("nick_name")
|
560
|
+
+ ensure
|
561
|
+
+ Person.connection.remove_column("people","nick_name")
|
562
|
+
+ Person.connection.add_column("people","first_name", :string)
|
563
|
+
+ end
|
564
|
+
end
|
565
|
+
end
|
566
|
+
|
567
|
+
- def test_rename_table
|
568
|
+
- begin
|
569
|
+
- ActiveRecord::Base.connection.create_table :octopuses do |t|
|
570
|
+
- t.column :url, :string
|
571
|
+
- end
|
572
|
+
- ActiveRecord::Base.connection.rename_table :octopuses, :octopi
|
573
|
+
-
|
574
|
+
- assert_nothing_raised do
|
575
|
+
- if current_adapter?(:OracleAdapter)
|
576
|
+
- # Oracle requires the explicit sequence value for the pk
|
577
|
+
- ActiveRecord::Base.connection.execute "INSERT INTO octopi (id, url) VALUES (1, 'http://www.foreverflying.com/octopus-black7.jpg')"
|
578
|
+
- else
|
579
|
+
- ActiveRecord::Base.connection.execute "INSERT INTO octopi (url) VALUES ('http://www.foreverflying.com/octopus-black7.jpg')"
|
580
|
+
+ # Ingres doesn't support renaming of tables. Skip test.
|
581
|
+
+ unless current_adapter?(:ODBCAdapter) && [:ingres].include?(ActiveRecord::Base.connection.dbmsName)
|
582
|
+
+ def test_rename_table
|
583
|
+
+ begin
|
584
|
+
+ ActiveRecord::Base.connection.create_table :octopuses do |t|
|
585
|
+
+ t.column :url, :string
|
586
|
+
end
|
587
|
+
+ ActiveRecord::Base.connection.rename_table :octopuses, :octopi
|
588
|
+
+
|
589
|
+
+ assert_nothing_raised do
|
590
|
+
+ if current_adapter?(:OracleAdapter) ||
|
591
|
+
+ current_adapter?(:ODBCAdapter) && [:oracle].include?(ActiveRecord::Base.connection.dbmsName)
|
592
|
+
+ # Oracle requires the explicit sequence value for the pk
|
593
|
+
+ ActiveRecord::Base.connection.execute "INSERT INTO octopi (id, url) VALUES (1, 'http://www.foreverflying.com/octopus-black7.jpg')"
|
594
|
+
+ else
|
595
|
+
+ ActiveRecord::Base.connection.execute "INSERT INTO octopi (url) VALUES ('http://www.foreverflying.com/octopus-black7.jpg')"
|
596
|
+
+ end
|
597
|
+
+ end
|
598
|
+
+
|
599
|
+
+ assert_equal 'http://www.foreverflying.com/octopus-black7.jpg', ActiveRecord::Base.connection.select_value("SELECT url FROM octopi WHERE id=1")
|
600
|
+
+
|
601
|
+
+ ensure
|
602
|
+
+ ActiveRecord::Base.connection.drop_table :octopuses rescue nil
|
603
|
+
+ ActiveRecord::Base.connection.drop_table :octopi rescue nil
|
604
|
+
end
|
605
|
+
-
|
606
|
+
- assert_equal 'http://www.foreverflying.com/octopus-black7.jpg', ActiveRecord::Base.connection.select_value("SELECT url FROM octopi WHERE id=1")
|
607
|
+
-
|
608
|
+
- ensure
|
609
|
+
- ActiveRecord::Base.connection.drop_table :octopuses rescue nil
|
610
|
+
- ActiveRecord::Base.connection.drop_table :octopi rescue nil
|
611
|
+
end
|
612
|
+
end
|
613
|
+
|
614
|
+
- def test_change_column
|
615
|
+
- Person.connection.add_column 'people', 'age', :integer
|
616
|
+
- old_columns = Person.connection.columns(Person.table_name, "#{name} Columns")
|
617
|
+
- assert old_columns.find { |c| c.name == 'age' and c.type == :integer }
|
618
|
+
+ # Virtuoso disallows virtually all column type conversions.
|
619
|
+
+ # Conversion between any of the native types used by the ActiveRecord generic types is not allowed.
|
620
|
+
+ # Skip the test.
|
621
|
+
+ unless current_adapter?(:ODBCAdapter) && [:virtuoso].include?(ActiveRecord::Base.connection.dbmsName)
|
622
|
+
+ def test_change_column
|
623
|
+
+ #Ingres doesn't support changing an integer column to varchar/text.
|
624
|
+
+ if current_adapter?(:ODBCAdapter) && [:ingres].include?(ActiveRecord::Base.connection.dbmsName)
|
625
|
+
+ initial_type = :integer
|
626
|
+
+ new_type = :float
|
627
|
+
+ else
|
628
|
+
+ initial_type = :integer
|
629
|
+
+ new_type = :string
|
630
|
+
+ end
|
631
|
+
+
|
632
|
+
+ Person.connection.add_column 'people', 'age', initial_type
|
633
|
+
+ old_columns = Person.connection.columns(Person.table_name, "#{name} Columns")
|
634
|
+
+ assert old_columns.find { |c| c.name == 'age' and c.type == initial_type }
|
635
|
+
+
|
636
|
+
+ assert_nothing_raised { Person.connection.change_column "people", "age", new_type }
|
637
|
+
+
|
638
|
+
+ new_columns = Person.connection.columns(Person.table_name, "#{name} Columns")
|
639
|
+
+ assert_nil new_columns.find { |c| c.name == 'age' and c.type == initial_type }
|
640
|
+
+ assert new_columns.find { |c| c.name == 'age' and c.type == new_type }
|
641
|
+
+ end
|
642
|
+
+ end
|
643
|
+
|
644
|
+
- assert_nothing_raised { Person.connection.change_column "people", "age", :string }
|
645
|
+
-
|
646
|
+
- new_columns = Person.connection.columns(Person.table_name, "#{name} Columns")
|
647
|
+
- assert_nil new_columns.find { |c| c.name == 'age' and c.type == :integer }
|
648
|
+
- assert new_columns.find { |c| c.name == 'age' and c.type == :string }
|
649
|
+
- end
|
650
|
+
-
|
651
|
+
- def test_change_column_with_new_default
|
652
|
+
- Person.connection.add_column "people", "administrator", :boolean, :default => 1
|
653
|
+
- Person.reset_column_information
|
654
|
+
- assert Person.new.administrator?
|
655
|
+
-
|
656
|
+
- assert_nothing_raised { Person.connection.change_column "people", "administrator", :boolean, :default => 0 }
|
657
|
+
- Person.reset_column_information
|
658
|
+
- assert !Person.new.administrator?
|
659
|
+
- end
|
660
|
+
-
|
661
|
+
+ # Ingres doesn't support ALTER TABLE ADD COLUMN WITH NULL WITH DEFAULT.
|
662
|
+
+ # Sybase ASE's ALTER TABLE doesn't support altering a column's DEFAULT definition.
|
663
|
+
+ unless current_adapter?(:ODBCAdapter) && [:ingres, :sybase].include?(ActiveRecord::Base.connection.dbmsName)
|
664
|
+
+ def test_change_column_with_new_default
|
665
|
+
+ Person.connection.add_column "people", "administrator", :boolean, :default => 1
|
666
|
+
+ Person.reset_column_information
|
667
|
+
+ assert Person.new.administrator?
|
668
|
+
+
|
669
|
+
+ assert_nothing_raised { Person.connection.change_column "people", "administrator", :boolean, :default => 0 }
|
670
|
+
+ Person.reset_column_information
|
671
|
+
+ assert !Person.new.administrator?
|
672
|
+
+ end
|
673
|
+
+ end
|
674
|
+
+
|
675
|
+
def test_add_table
|
676
|
+
assert !Reminder.table_exists?
|
677
|
+
|
678
|
+
@@ -465,9 +527,20 @@
|
679
|
+
Person.connection.drop_table :binary_testings rescue nil
|
680
|
+
|
681
|
+
assert_nothing_raised {
|
682
|
+
+ if current_adapter?(:ODBCAdapter) && [:informix, :ingres].include?(ActiveRecord::Base.connection.dbmsName)
|
683
|
+
+ # Specifying a non-null default generates the following error:
|
684
|
+
+ # Informix:
|
685
|
+
+ # "Cannot specify non-null default value for blob column. (-594)"
|
686
|
+
+ # Ingres:
|
687
|
+
+ # "Cannot create a default on column of type 'long byte'"
|
688
|
+
Person.connection.create_table :binary_testings do |t|
|
689
|
+
+ t.column "data", :binary
|
690
|
+
+ end
|
691
|
+
+ else
|
692
|
+
+ Person.connection.create_table :binary_testings do |t|
|
693
|
+
t.column "data", :binary, :default => "", :null => false
|
694
|
+
end
|
695
|
+
+ end
|
696
|
+
}
|
697
|
+
|
698
|
+
columns = Person.connection.columns(:binary_testings)
|
699
|
+
@@ -475,6 +548,8 @@
|
700
|
+
|
701
|
+
if current_adapter?(:OracleAdapter)
|
702
|
+
assert_equal "empty_blob()", data_column.default
|
703
|
+
+ elsif current_adapter?(:ODBCAdapter) && [:informix, :ingres].include?(ActiveRecord::Base.connection.dbmsName)
|
704
|
+
+ assert_nil data_column.default
|
705
|
+
else
|
706
|
+
assert_equal "", data_column.default
|
707
|
+
end
|