pmacs-activerecord-oracle_enhanced-adapter 1.4.2.rc1 → 1.5.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +11 -40
- data/History.md +170 -0
- data/README.md +61 -5
- data/Rakefile +1 -0
- data/VERSION +1 -1
- data/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb +330 -161
- data/lib/active_record/connection_adapters/oracle_enhanced_column.rb +48 -8
- data/lib/active_record/connection_adapters/oracle_enhanced_column_dumper.rb +77 -0
- data/lib/active_record/connection_adapters/oracle_enhanced_connection.rb +8 -24
- data/lib/active_record/connection_adapters/oracle_enhanced_context_index.rb +4 -13
- data/lib/active_record/connection_adapters/oracle_enhanced_database_tasks.rb +61 -0
- data/lib/active_record/connection_adapters/oracle_enhanced_dirty.rb +13 -12
- data/lib/active_record/connection_adapters/oracle_enhanced_jdbc_connection.rb +42 -19
- data/lib/active_record/connection_adapters/oracle_enhanced_oci_connection.rb +28 -74
- data/lib/active_record/connection_adapters/oracle_enhanced_procedures.rb +165 -231
- data/lib/active_record/connection_adapters/oracle_enhanced_schema_creation.rb +89 -0
- data/lib/active_record/connection_adapters/oracle_enhanced_schema_definitions.rb +16 -24
- data/lib/active_record/connection_adapters/oracle_enhanced_schema_dumper.rb +29 -38
- data/lib/active_record/connection_adapters/oracle_enhanced_schema_statements.rb +93 -42
- data/lib/active_record/connection_adapters/oracle_enhanced_schema_statements_ext.rb +5 -3
- data/lib/active_record/connection_adapters/oracle_enhanced_structure_dump.rb +7 -7
- data/lib/active_record/connection_adapters/oracle_enhanced_version.rb +1 -1
- data/lib/pmacs-activerecord-oracle_enhanced-adapter.rb +2 -2
- data/pmacs-activerecord-oracle_enhanced-adapter.gemspec +19 -17
- data/spec/active_record/connection_adapters/oracle_enhanced_adapter_spec.rb +35 -99
- data/spec/active_record/connection_adapters/oracle_enhanced_connection_spec.rb +17 -3
- data/spec/active_record/connection_adapters/oracle_enhanced_context_index_spec.rb +105 -98
- data/spec/active_record/connection_adapters/oracle_enhanced_data_types_spec.rb +74 -44
- data/spec/active_record/connection_adapters/oracle_enhanced_database_tasks_spec.rb +89 -0
- data/spec/active_record/connection_adapters/oracle_enhanced_dbms_output_spec.rb +3 -3
- data/spec/active_record/connection_adapters/oracle_enhanced_dirty_spec.rb +13 -2
- data/spec/active_record/connection_adapters/oracle_enhanced_procedures_spec.rb +11 -12
- data/spec/active_record/connection_adapters/oracle_enhanced_schema_dump_spec.rb +252 -60
- data/spec/active_record/connection_adapters/oracle_enhanced_schema_statements_spec.rb +170 -40
- data/spec/active_record/connection_adapters/oracle_enhanced_structure_dump_spec.rb +14 -8
- data/spec/spec_helper.rb +25 -54
- metadata +41 -72
- data/lib/active_record/connection_adapters/oracle_enhanced.rake +0 -105
- data/lib/active_record/connection_adapters/oracle_enhanced_activerecord_patches.rb +0 -41
- data/lib/active_record/connection_adapters/oracle_enhanced_base_ext.rb +0 -118
- data/lib/active_record/connection_adapters/oracle_enhanced_core_ext.rb +0 -25
- data/lib/active_record/connection_adapters/oracle_enhanced_tasks.rb +0 -17
- data/spec/active_record/connection_adapters/oracle_enhanced_core_ext_spec.rb +0 -19
@@ -6,7 +6,8 @@ describe "OracleEnhancedAdapter schema dump" do
|
|
6
6
|
before(:all) do
|
7
7
|
ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
|
8
8
|
@conn = ActiveRecord::Base.connection
|
9
|
-
@
|
9
|
+
@oracle11g_or_higher = !! @conn.select_value(
|
10
|
+
"select * from product_component_version where product like 'Oracle%' and to_number(substr(version,1,2)) >= 11")
|
10
11
|
end
|
11
12
|
|
12
13
|
def standard_dump(options = {})
|
@@ -17,7 +18,7 @@ describe "OracleEnhancedAdapter schema dump" do
|
|
17
18
|
end
|
18
19
|
|
19
20
|
def create_test_posts_table(options = {})
|
20
|
-
options.merge! :
|
21
|
+
options.merge! force: true
|
21
22
|
schema_define do
|
22
23
|
create_table :test_posts, options do |t|
|
23
24
|
t.string :title
|
@@ -42,12 +43,12 @@ describe "OracleEnhancedAdapter schema dump" do
|
|
42
43
|
|
43
44
|
it "should not include ignored table names in schema dump" do
|
44
45
|
create_test_posts_table
|
45
|
-
standard_dump(:
|
46
|
+
standard_dump(ignore_tables: %w(test_posts)).should_not =~ /create_table "test_posts"/
|
46
47
|
end
|
47
48
|
|
48
49
|
it "should not include ignored table regexes in schema dump" do
|
49
50
|
create_test_posts_table
|
50
|
-
standard_dump(:
|
51
|
+
standard_dump(ignore_tables: [ /test_posts/i ]).should_not =~ /create_table "test_posts"/
|
51
52
|
end
|
52
53
|
|
53
54
|
end
|
@@ -55,9 +56,9 @@ describe "OracleEnhancedAdapter schema dump" do
|
|
55
56
|
describe "dumping default values" do
|
56
57
|
before :each do
|
57
58
|
schema_define do
|
58
|
-
create_table "test_defaults", :
|
59
|
-
t.string "regular", :
|
60
|
-
t.string "special_c", :
|
59
|
+
create_table "test_defaults", force: true do |t|
|
60
|
+
t.string "regular", default: "c"
|
61
|
+
t.string "special_c", default: "\n"
|
61
62
|
end
|
62
63
|
end
|
63
64
|
end
|
@@ -69,7 +70,7 @@ describe "OracleEnhancedAdapter schema dump" do
|
|
69
70
|
end
|
70
71
|
|
71
72
|
it "should be able to dump default values using special characters" do
|
72
|
-
standard_dump.should =~ /t.string \"special_c\", :
|
73
|
+
standard_dump.should =~ /t.string \"special_c\", default: "\\n"/
|
73
74
|
end
|
74
75
|
end
|
75
76
|
describe "table prefixes and suffixes" do
|
@@ -124,8 +125,8 @@ describe "OracleEnhancedAdapter schema dump" do
|
|
124
125
|
end
|
125
126
|
|
126
127
|
it "should include non-default primary key in schema dump" do
|
127
|
-
create_test_posts_table(:
|
128
|
-
standard_dump.should =~ /create_table "test_posts", :
|
128
|
+
create_test_posts_table(primary_key: 'post_id')
|
129
|
+
standard_dump.should =~ /create_table "test_posts", primary_key: "post_id"/
|
129
130
|
end
|
130
131
|
|
131
132
|
end
|
@@ -138,13 +139,13 @@ describe "OracleEnhancedAdapter schema dump" do
|
|
138
139
|
end
|
139
140
|
|
140
141
|
it "should include primary key trigger in schema dump" do
|
141
|
-
create_test_posts_table(:
|
142
|
+
create_test_posts_table(primary_key_trigger: true)
|
142
143
|
standard_dump.should =~ /create_table "test_posts".*add_primary_key_trigger "test_posts"/m
|
143
144
|
end
|
144
145
|
|
145
146
|
it "should include primary key trigger with non-default primary key in schema dump" do
|
146
|
-
create_test_posts_table(:
|
147
|
-
standard_dump.should =~ /create_table "test_posts", :
|
147
|
+
create_test_posts_table(primary_key_trigger: true, primary_key: 'post_id')
|
148
|
+
standard_dump.should =~ /create_table "test_posts", primary_key: "post_id".*add_primary_key_trigger "test_posts", primary_key: "post_id"/m
|
148
149
|
end
|
149
150
|
|
150
151
|
end
|
@@ -152,11 +153,11 @@ describe "OracleEnhancedAdapter schema dump" do
|
|
152
153
|
describe "foreign key constraints" do
|
153
154
|
before(:all) do
|
154
155
|
schema_define do
|
155
|
-
create_table :test_posts, :
|
156
|
+
create_table :test_posts, force: true do |t|
|
156
157
|
t.string :title
|
157
158
|
end
|
158
|
-
create_table :test_comments, :
|
159
|
-
t.string :body, :
|
159
|
+
create_table :test_comments, force: true do |t|
|
160
|
+
t.string :body, limit: 4000
|
160
161
|
t.references :test_post
|
161
162
|
end
|
162
163
|
end
|
@@ -165,7 +166,7 @@ describe "OracleEnhancedAdapter schema dump" do
|
|
165
166
|
after(:each) do
|
166
167
|
schema_define do
|
167
168
|
remove_foreign_key :test_comments, :test_posts rescue nil
|
168
|
-
remove_foreign_key :test_comments, :
|
169
|
+
remove_foreign_key :test_comments, name: 'comments_posts_baz_fooz_fk' rescue nil
|
169
170
|
end
|
170
171
|
end
|
171
172
|
after(:all) do
|
@@ -179,49 +180,49 @@ describe "OracleEnhancedAdapter schema dump" do
|
|
179
180
|
schema_define do
|
180
181
|
add_foreign_key :test_comments, :test_posts
|
181
182
|
end
|
182
|
-
standard_dump.should =~ /add_foreign_key "test_comments", "test_posts", :
|
183
|
+
standard_dump.should =~ /add_foreign_key "test_comments", "test_posts", name: "test_comments_test_post_id_fk"/
|
183
184
|
end
|
184
185
|
|
185
186
|
it "should include foreign key with delete dependency in schema dump" do
|
186
187
|
schema_define do
|
187
|
-
add_foreign_key :test_comments, :test_posts, :
|
188
|
+
add_foreign_key :test_comments, :test_posts, dependent: :delete
|
188
189
|
end
|
189
|
-
standard_dump.should =~ /add_foreign_key "test_comments", "test_posts", :
|
190
|
+
standard_dump.should =~ /add_foreign_key "test_comments", "test_posts", name: "test_comments_test_post_id_fk", dependent: :delete/
|
190
191
|
end
|
191
192
|
|
192
193
|
it "should include foreign key with nullify dependency in schema dump" do
|
193
194
|
schema_define do
|
194
|
-
add_foreign_key :test_comments, :test_posts, :
|
195
|
+
add_foreign_key :test_comments, :test_posts, dependent: :nullify
|
195
196
|
end
|
196
|
-
standard_dump.should =~ /add_foreign_key "test_comments", "test_posts", :
|
197
|
+
standard_dump.should =~ /add_foreign_key "test_comments", "test_posts", name: "test_comments_test_post_id_fk", dependent: :nullify/
|
197
198
|
end
|
198
199
|
|
199
200
|
it "should not include foreign keys on ignored table names in schema dump" do
|
200
201
|
schema_define do
|
201
202
|
add_foreign_key :test_comments, :test_posts
|
202
203
|
end
|
203
|
-
standard_dump(:
|
204
|
+
standard_dump(ignore_tables: %w(test_comments)).should_not =~ /add_foreign_key "test_comments"/
|
204
205
|
end
|
205
206
|
|
206
207
|
it "should not include foreign keys on ignored table regexes in schema dump" do
|
207
208
|
schema_define do
|
208
209
|
add_foreign_key :test_comments, :test_posts
|
209
210
|
end
|
210
|
-
standard_dump(:
|
211
|
+
standard_dump(ignore_tables: [ /test_comments/i ]).should_not =~ /add_foreign_key "test_comments"/
|
211
212
|
end
|
212
213
|
|
213
214
|
it "should include foreign keys referencing ignored table names in schema dump" do
|
214
215
|
schema_define do
|
215
216
|
add_foreign_key :test_comments, :test_posts
|
216
217
|
end
|
217
|
-
standard_dump(:
|
218
|
+
standard_dump(ignore_tables: %w(test_posts)).should =~ /add_foreign_key "test_comments"/
|
218
219
|
end
|
219
220
|
|
220
221
|
it "should include foreign keys referencing ignored table regexes in schema dump" do
|
221
222
|
schema_define do
|
222
223
|
add_foreign_key :test_comments, :test_posts
|
223
224
|
end
|
224
|
-
standard_dump(:
|
225
|
+
standard_dump(ignore_tables: [ /test_posts/i ]).should =~ /add_foreign_key "test_comments"/
|
225
226
|
end
|
226
227
|
|
227
228
|
it "should include composite foreign keys" do
|
@@ -237,9 +238,9 @@ describe "OracleEnhancedAdapter schema dump" do
|
|
237
238
|
add_column :test_comments, :baz_id, :integer
|
238
239
|
add_column :test_comments, :fooz_id, :integer
|
239
240
|
|
240
|
-
add_foreign_key :test_comments, :test_posts, :
|
241
|
+
add_foreign_key :test_comments, :test_posts, columns: ["baz_id", "fooz_id"], name: 'comments_posts_baz_fooz_fk'
|
241
242
|
end
|
242
|
-
standard_dump.should =~ /add_foreign_key "test_comments", "test_posts", :
|
243
|
+
standard_dump.should =~ /add_foreign_key "test_comments", "test_posts", columns: \["baz_id", "fooz_id"\], name: "comments_posts_baz_fooz_fk"/
|
243
244
|
end
|
244
245
|
it "should include foreign keys following all tables" do
|
245
246
|
# if foreign keys preceed declaration of all tables
|
@@ -250,6 +251,26 @@ describe "OracleEnhancedAdapter schema dump" do
|
|
250
251
|
dump = standard_dump
|
251
252
|
dump.rindex("create_table").should < dump.index("add_foreign_key")
|
252
253
|
end
|
254
|
+
|
255
|
+
it "should include primary_key when reference column name is not 'id'" do
|
256
|
+
schema_define do
|
257
|
+
create_table :test_posts, force: true, :primary_key => 'baz_id' do |t|
|
258
|
+
t.string :title
|
259
|
+
end
|
260
|
+
create_table :test_comments, force: true do |t|
|
261
|
+
t.string :body, limit: 4000
|
262
|
+
t.integer :baz_id
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
266
|
+
@conn.execute <<-SQL
|
267
|
+
ALTER TABLE TEST_COMMENTS
|
268
|
+
ADD CONSTRAINT TEST_COMMENTS_BAZ_ID_FK FOREIGN KEY (baz_id) REFERENCES test_posts(baz_id)
|
269
|
+
SQL
|
270
|
+
|
271
|
+
standard_dump.should =~ /add_foreign_key "test_comments", "test_posts", column: "baz_id", primary_key: "baz_id", name: "test_comments_baz_id_fk"/
|
272
|
+
end
|
273
|
+
|
253
274
|
end
|
254
275
|
|
255
276
|
describe "synonyms" do
|
@@ -261,37 +282,37 @@ describe "OracleEnhancedAdapter schema dump" do
|
|
261
282
|
|
262
283
|
it "should include synonym to other schema table in schema dump" do
|
263
284
|
schema_define do
|
264
|
-
add_synonym :test_synonym, "schema_name.table_name", :
|
285
|
+
add_synonym :test_synonym, "schema_name.table_name", force: true
|
265
286
|
end
|
266
|
-
standard_dump.should =~ /add_synonym "test_synonym", "schema_name.table_name", :
|
287
|
+
standard_dump.should =~ /add_synonym "test_synonym", "schema_name.table_name", force: true/
|
267
288
|
end
|
268
289
|
|
269
290
|
it "should include synonym to other database table in schema dump" do
|
270
291
|
schema_define do
|
271
|
-
add_synonym :test_synonym, "table_name@link_name", :
|
292
|
+
add_synonym :test_synonym, "table_name@link_name", force: true
|
272
293
|
end
|
273
|
-
standard_dump.should =~ /add_synonym "test_synonym", "table_name@link_name(\.[-A-Za-z0-9_]+)*", :
|
294
|
+
standard_dump.should =~ /add_synonym "test_synonym", "table_name@link_name(\.[-A-Za-z0-9_]+)*", force: true/
|
274
295
|
end
|
275
296
|
|
276
297
|
it "should not include ignored table names in schema dump" do
|
277
298
|
schema_define do
|
278
|
-
add_synonym :test_synonym, "schema_name.table_name", :
|
299
|
+
add_synonym :test_synonym, "schema_name.table_name", force: true
|
279
300
|
end
|
280
|
-
standard_dump(:
|
301
|
+
standard_dump(ignore_tables: %w(test_synonym)).should_not =~ /add_synonym "test_synonym"/
|
281
302
|
end
|
282
303
|
|
283
304
|
it "should not include ignored table regexes in schema dump" do
|
284
305
|
schema_define do
|
285
|
-
add_synonym :test_synonym, "schema_name.table_name", :
|
306
|
+
add_synonym :test_synonym, "schema_name.table_name", force: true
|
286
307
|
end
|
287
|
-
standard_dump(:
|
308
|
+
standard_dump(ignore_tables: [ /test_synonym/i ]).should_not =~ /add_synonym "test_synonym"/
|
288
309
|
end
|
289
310
|
|
290
311
|
it "should include synonyms to ignored table regexes in schema dump" do
|
291
312
|
schema_define do
|
292
|
-
add_synonym :test_synonym, "schema_name.table_name", :
|
313
|
+
add_synonym :test_synonym, "schema_name.table_name", force: true
|
293
314
|
end
|
294
|
-
standard_dump(:
|
315
|
+
standard_dump(ignore_tables: [ /table_name/i ]).should =~ /add_synonym "test_synonym"/
|
295
316
|
end
|
296
317
|
|
297
318
|
end
|
@@ -302,8 +323,8 @@ describe "OracleEnhancedAdapter schema dump" do
|
|
302
323
|
end
|
303
324
|
|
304
325
|
it "should include temporary options" do
|
305
|
-
create_test_posts_table(:
|
306
|
-
standard_dump.should =~ /create_table "test_posts", :
|
326
|
+
create_test_posts_table(temporary: true)
|
327
|
+
standard_dump.should =~ /create_table "test_posts", temporary: true/
|
307
328
|
end
|
308
329
|
end
|
309
330
|
|
@@ -314,20 +335,20 @@ describe "OracleEnhancedAdapter schema dump" do
|
|
314
335
|
|
315
336
|
it "should not specify default tablespace in add index" do
|
316
337
|
create_test_posts_table
|
317
|
-
standard_dump.should =~ /add_index "test_posts", \["title"\], :
|
338
|
+
standard_dump.should =~ /add_index "test_posts", \["title"\], name: "index_test_posts_on_title"$/
|
318
339
|
end
|
319
340
|
|
320
341
|
it "should specify non-default tablespace in add index" do
|
321
342
|
tablespace_name = @conn.default_tablespace
|
322
343
|
@conn.stub!(:default_tablespace).and_return('dummy')
|
323
344
|
create_test_posts_table
|
324
|
-
standard_dump.should =~ /add_index "test_posts", \["title"\], :
|
345
|
+
standard_dump.should =~ /add_index "test_posts", \["title"\], name: "index_test_posts_on_title", tablespace: "#{tablespace_name}"$/
|
325
346
|
end
|
326
347
|
|
327
348
|
it "should create and dump function-based indexes" do
|
328
349
|
create_test_posts_table
|
329
|
-
@conn.add_index :test_posts, "NVL(created_at, updated_at)", :
|
330
|
-
standard_dump.should =~ /add_index "test_posts", \["NVL\(\\"CREATED_AT\\",\\"UPDATED_AT\\"\)"\], :
|
350
|
+
@conn.add_index :test_posts, "NVL(created_at, updated_at)", name: "index_test_posts_cr_upd_at"
|
351
|
+
standard_dump.should =~ /add_index "test_posts", \["NVL\(\\"CREATED_AT\\",\\"UPDATED_AT\\"\)"\], name: "index_test_posts_cr_upd_at"$/
|
331
352
|
end
|
332
353
|
|
333
354
|
end
|
@@ -347,7 +368,7 @@ describe "OracleEnhancedAdapter schema dump" do
|
|
347
368
|
|
348
369
|
describe 'virtual columns' do
|
349
370
|
before(:all) do
|
350
|
-
if @
|
371
|
+
if @oracle11g_or_higher
|
351
372
|
schema_define do
|
352
373
|
create_table :test_names, :force => true do |t|
|
353
374
|
t.string :first_name
|
@@ -355,6 +376,7 @@ describe "OracleEnhancedAdapter schema dump" do
|
|
355
376
|
t.virtual :full_name, :as => "first_name || ', ' || last_name"
|
356
377
|
t.virtual :short_name, :as => "COALESCE(first_name, last_name)", :type => :string, :limit => 300
|
357
378
|
t.virtual :abbrev_name, :as => "SUBSTR(first_name,1,50) || ' ' || SUBSTR(last_name,1,1) || '.'", :type => "VARCHAR(100)"
|
379
|
+
t.virtual :name_ratio, :as=>'(LENGTH(first_name)/LENGTH(last_name))'
|
358
380
|
t.column :full_name_length, :virtual, :as => "length(first_name || ', ' || last_name)", :type => :integer
|
359
381
|
t.virtual :field_with_leading_space, :as => "' ' || first_name || ' '", :limit => 300, :type => :string
|
360
382
|
end
|
@@ -365,31 +387,45 @@ describe "OracleEnhancedAdapter schema dump" do
|
|
365
387
|
end
|
366
388
|
|
367
389
|
before(:each) do
|
368
|
-
if @
|
390
|
+
if @oracle11g_or_higher
|
369
391
|
class ::TestName < ActiveRecord::Base
|
370
|
-
|
371
|
-
self.table_name = "test_names"
|
372
|
-
else
|
373
|
-
set_table_name "test_names"
|
374
|
-
end
|
392
|
+
self.table_name = "test_names"
|
375
393
|
end
|
376
394
|
end
|
377
395
|
end
|
378
396
|
|
379
397
|
after(:all) do
|
380
|
-
if @
|
398
|
+
if @oracle11g_or_higher
|
381
399
|
schema_define do
|
382
400
|
drop_table :test_names
|
383
401
|
end
|
384
402
|
end
|
385
403
|
end
|
386
404
|
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
405
|
+
context "when number_datatype_coercion is :float" do
|
406
|
+
before { ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.stub(:number_datatype_coercion).and_return(:float) }
|
407
|
+
|
408
|
+
it 'should dump correctly' do
|
409
|
+
standard_dump.should =~ /t\.virtual "full_name",(\s*)limit: 512,(\s*)as: "\\"FIRST_NAME\\"\|\|', '\|\|\\"LAST_NAME\\"",(\s*)type: :string/
|
410
|
+
standard_dump.should =~ /t\.virtual "short_name",(\s*)limit: 300,(\s*)as:(.*),(\s*)type: :string/
|
411
|
+
standard_dump.should =~ /t\.virtual "full_name_length",(\s*)precision: 38,(\s*)scale: 0,(\s*)as:(.*),(\s*)type: :integer/
|
412
|
+
standard_dump.should =~ /t\.virtual "name_ratio",(\s*)as:(.*),(\s*)type: :float$/
|
413
|
+
standard_dump.should =~ /t\.virtual "abbrev_name",(\s*)limit: 100,(\s*)as:(.*),(\s*)type: :string/
|
414
|
+
standard_dump.should =~ /t\.virtual "field_with_leading_space",(\s*)limit: 300,(\s*)as: "' '\|\|\\"FIRST_NAME\\"\|\|' '",(\s*)type: :string/
|
415
|
+
end
|
416
|
+
end
|
417
|
+
|
418
|
+
context "when number_datatype_coercion is :decimal" do
|
419
|
+
before { ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.stub(:number_datatype_coercion).and_return(:decimal) }
|
420
|
+
|
421
|
+
it 'should dump correctly' do
|
422
|
+
standard_dump.should =~ /t\.virtual "full_name",(\s*)limit: 512,(\s*)as: "\\"FIRST_NAME\\"\|\|', '\|\|\\"LAST_NAME\\"",(\s*)type: :string/
|
423
|
+
standard_dump.should =~ /t\.virtual "short_name",(\s*)limit: 300,(\s*)as:(.*),(\s*)type: :string/
|
424
|
+
standard_dump.should =~ /t\.virtual "full_name_length",(\s*)precision: 38,(\s*)scale: 0,(\s*)as:(.*),(\s*)type: :integer/
|
425
|
+
standard_dump.should =~ /t\.virtual "name_ratio",(\s*)as:(.*)\"$/
|
426
|
+
standard_dump.should =~ /t\.virtual "abbrev_name",(\s*)limit: 100,(\s*)as:(.*),(\s*)type: :string/
|
427
|
+
standard_dump.should =~ /t\.virtual "field_with_leading_space",(\s*)limit: 300,(\s*)as: "' '\|\|\\"FIRST_NAME\\"\|\|' '",(\s*)type: :string/
|
428
|
+
end
|
393
429
|
end
|
394
430
|
|
395
431
|
context 'with column cache' do
|
@@ -415,14 +451,14 @@ describe "OracleEnhancedAdapter schema dump" do
|
|
415
451
|
|
416
452
|
context "with index on virtual column" do
|
417
453
|
before(:all) do
|
418
|
-
if @
|
454
|
+
if @oracle11g_or_higher
|
419
455
|
schema_define do
|
420
456
|
add_index 'test_names', 'field_with_leading_space', :name => "index_on_virtual_col"
|
421
457
|
end
|
422
458
|
end
|
423
459
|
end
|
424
460
|
after(:all) do
|
425
|
-
if @
|
461
|
+
if @oracle11g_or_higher
|
426
462
|
schema_define do
|
427
463
|
remove_index 'test_names', :name => 'index_on_virtual_col'
|
428
464
|
end
|
@@ -435,4 +471,160 @@ describe "OracleEnhancedAdapter schema dump" do
|
|
435
471
|
end
|
436
472
|
end
|
437
473
|
|
474
|
+
describe "NUMBER columns" do
|
475
|
+
after(:each) do
|
476
|
+
schema_define do
|
477
|
+
drop_table "test_numbers"
|
478
|
+
end
|
479
|
+
end
|
480
|
+
|
481
|
+
let(:value_within_max_precision) { (10 ** @conn.class::NUMBER_MAX_PRECISION) - 1 }
|
482
|
+
let(:value_exceeding_max_precision) { (10 ** @conn.class::NUMBER_MAX_PRECISION) + 1 }
|
483
|
+
|
484
|
+
context "when using ActiveRecord::Schema.define and ActiveRecord::ConnectionAdapters::TableDefinition#float" do
|
485
|
+
before :each do
|
486
|
+
schema_define do
|
487
|
+
create_table :test_numbers, :force => true do |t|
|
488
|
+
t.float :value
|
489
|
+
end
|
490
|
+
end
|
491
|
+
end
|
492
|
+
|
493
|
+
context "when number_datatype_coercion is :float" do
|
494
|
+
before { ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.stub(:number_datatype_coercion).and_return(:float) }
|
495
|
+
|
496
|
+
it "should dump correctly" do
|
497
|
+
standard_dump.should =~ /t\.float "value"$/
|
498
|
+
end
|
499
|
+
end
|
500
|
+
|
501
|
+
context "when number_datatype_coercion is :decimal" do
|
502
|
+
before { ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.stub(:number_datatype_coercion).and_return(:decimal) }
|
503
|
+
|
504
|
+
it "should dump correctly" do
|
505
|
+
standard_dump.should =~ /t\.decimal "value"$/
|
506
|
+
end
|
507
|
+
end
|
508
|
+
end
|
509
|
+
|
510
|
+
context "when using handwritten 'CREATE_TABLE' SQL" do
|
511
|
+
before :each do
|
512
|
+
ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
|
513
|
+
@conn = ActiveRecord::Base.connection
|
514
|
+
@conn.execute <<-SQL
|
515
|
+
CREATE TABLE test_numbers (
|
516
|
+
id NUMBER(#{@conn.class::NUMBER_MAX_PRECISION},0) PRIMARY KEY,
|
517
|
+
value NUMBER
|
518
|
+
)
|
519
|
+
SQL
|
520
|
+
@conn.execute <<-SQL
|
521
|
+
CREATE SEQUENCE test_numbers_seq MINVALUE 1
|
522
|
+
INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE
|
523
|
+
SQL
|
524
|
+
end
|
525
|
+
|
526
|
+
context "when number_datatype_coercion is :float" do
|
527
|
+
before { ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.stub(:number_datatype_coercion).and_return(:float) }
|
528
|
+
|
529
|
+
it "should dump correctly" do
|
530
|
+
standard_dump.should =~ /t\.float "value"$/
|
531
|
+
end
|
532
|
+
|
533
|
+
describe "ActiveRecord saving" do
|
534
|
+
before :each do
|
535
|
+
class ::TestNumber < ActiveRecord::Base
|
536
|
+
self.table_name = "test_numbers"
|
537
|
+
end
|
538
|
+
end
|
539
|
+
|
540
|
+
it "should allow saving of values within NUMBER_MAX_PRECISION" do
|
541
|
+
number = TestNumber.new(value: value_within_max_precision)
|
542
|
+
number.save!
|
543
|
+
number.reload
|
544
|
+
number.value.should eq(value_within_max_precision)
|
545
|
+
end
|
546
|
+
|
547
|
+
it "should allow saving of values larger than NUMBER_MAX_PRECISION" do
|
548
|
+
number = TestNumber.new(value: value_exceeding_max_precision)
|
549
|
+
number.save!
|
550
|
+
number.reload
|
551
|
+
number.value.should eq(value_exceeding_max_precision)
|
552
|
+
end
|
553
|
+
|
554
|
+
it "should be recreatable from dump and have same properties" do
|
555
|
+
# Simulating db:schema:dump & db:test:load
|
556
|
+
2.times do
|
557
|
+
create_table_dump = standard_dump[/(create_table.+?end)/m]
|
558
|
+
|
559
|
+
schema_define do
|
560
|
+
drop_table "test_numbers"
|
561
|
+
end
|
562
|
+
|
563
|
+
schema_define(&eval("-> * { #{create_table_dump} }"))
|
564
|
+
end
|
565
|
+
|
566
|
+
number = TestNumber.new(value: value_within_max_precision)
|
567
|
+
number.save!
|
568
|
+
|
569
|
+
number2 = TestNumber.new(value: value_exceeding_max_precision)
|
570
|
+
number2.save!
|
571
|
+
end
|
572
|
+
end
|
573
|
+
end
|
574
|
+
|
575
|
+
context "when number_datatype_coercion is :decimal" do
|
576
|
+
before { ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.stub(:number_datatype_coercion).and_return(:decimal) }
|
577
|
+
|
578
|
+
it "should dump correctly" do
|
579
|
+
standard_dump.should =~ /t\.decimal "value"$/
|
580
|
+
end
|
581
|
+
|
582
|
+
describe "ActiveRecord saving" do
|
583
|
+
before :each do
|
584
|
+
class ::TestNumber < ActiveRecord::Base
|
585
|
+
self.table_name = "test_numbers"
|
586
|
+
end
|
587
|
+
end
|
588
|
+
|
589
|
+
it "should allow saving of values within NUMBER_MAX_PRECISION" do
|
590
|
+
number = TestNumber.new(value: value_within_max_precision)
|
591
|
+
number.save!
|
592
|
+
number.reload
|
593
|
+
number.value.should eq(value_within_max_precision)
|
594
|
+
end
|
595
|
+
|
596
|
+
it "should allow saving of values larger than NUMBER_MAX_PRECISION" do
|
597
|
+
number = TestNumber.new(value: value_exceeding_max_precision)
|
598
|
+
number.save!
|
599
|
+
number.reload
|
600
|
+
number.value.should eq(value_exceeding_max_precision)
|
601
|
+
end
|
602
|
+
|
603
|
+
it "should be recreatable from dump and have same properties" do
|
604
|
+
# Simulating db:schema:dump & db:test:load
|
605
|
+
2.times do |i|
|
606
|
+
create_table_dump = standard_dump[/(create_table.+?end)/m]
|
607
|
+
|
608
|
+
schema_define do
|
609
|
+
drop_table "test_numbers"
|
610
|
+
end
|
611
|
+
|
612
|
+
schema_define(&eval("-> * { #{create_table_dump} }"))
|
613
|
+
end
|
614
|
+
|
615
|
+
number = TestNumber.new(value: value_within_max_precision)
|
616
|
+
number.save!
|
617
|
+
|
618
|
+
# Raises 'ORA-01438' as :value column type isn't FLOAT'ish
|
619
|
+
number2 = TestNumber.new(value: value_exceeding_max_precision)
|
620
|
+
lambda do
|
621
|
+
number2.save!
|
622
|
+
end.should raise_error() { |e| e.message.should =~ /ORA-01438/ }
|
623
|
+
end
|
624
|
+
end
|
625
|
+
end # context (:decimal)
|
626
|
+
|
627
|
+
end # context (handwritten)
|
628
|
+
end # describe (NUMBER columns)
|
629
|
+
|
438
630
|
end
|