activerecord-oracle_enhanced-adapter 1.5.6 → 1.6.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis/oracle/download.sh +14 -0
- data/.travis/oracle/install.sh +31 -0
- data/.travis/setup_accounts.sh +9 -0
- data/.travis.yml +39 -0
- data/Gemfile +8 -8
- data/History.md +189 -0
- data/README.md +388 -178
- data/RUNNING_TESTS.md +11 -6
- data/VERSION +1 -1
- data/activerecord-oracle_enhanced-adapter.gemspec +29 -26
- data/lib/active_record/connection_adapters/{oracle_enhanced_column.rb → oracle_enhanced/column.rb} +14 -63
- data/lib/active_record/connection_adapters/oracle_enhanced/column_dumper.rb +66 -0
- data/lib/active_record/connection_adapters/{oracle_enhanced_connection.rb → oracle_enhanced/connection.rb} +2 -2
- data/lib/active_record/connection_adapters/oracle_enhanced/context_index.rb +347 -0
- data/lib/active_record/connection_adapters/oracle_enhanced/database_statements.rb +260 -0
- data/lib/active_record/connection_adapters/oracle_enhanced/dirty.rb +40 -0
- data/lib/active_record/connection_adapters/{oracle_enhanced_jdbc_connection.rb → oracle_enhanced/jdbc_connection.rb} +13 -4
- data/lib/active_record/connection_adapters/{oracle_enhanced_oci_connection.rb → oracle_enhanced/oci_connection.rb} +11 -5
- data/lib/active_record/connection_adapters/{oracle_enhanced_procedures.rb → oracle_enhanced/procedures.rb} +1 -1
- data/lib/active_record/connection_adapters/{oracle_enhanced_schema_creation.rb → oracle_enhanced/schema_creation.rb} +34 -35
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_definitions.rb +95 -0
- data/lib/active_record/connection_adapters/{oracle_enhanced_schema_dumper.rb → oracle_enhanced/schema_dumper.rb} +14 -37
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_statements.rb +562 -0
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_statements_ext.rb +65 -0
- data/lib/active_record/connection_adapters/{oracle_enhanced_structure_dump.rb → oracle_enhanced/structure_dump.rb} +63 -14
- data/lib/active_record/connection_adapters/oracle_enhanced/version.rb +1 -0
- data/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb +171 -73
- data/lib/active_record/oracle_enhanced/type/integer.rb +13 -0
- data/lib/active_record/oracle_enhanced/type/raw.rb +13 -0
- data/lib/active_record/oracle_enhanced/type/timestamp.rb +11 -0
- data/lib/activerecord-oracle_enhanced-adapter.rb +1 -1
- data/spec/active_record/connection_adapters/oracle_enhanced_adapter_spec.rb +127 -49
- data/spec/active_record/connection_adapters/oracle_enhanced_connection_spec.rb +46 -5
- data/spec/active_record/connection_adapters/oracle_enhanced_context_index_spec.rb +11 -3
- data/spec/active_record/connection_adapters/oracle_enhanced_cpk_spec.rb +3 -3
- data/spec/active_record/connection_adapters/oracle_enhanced_data_types_spec.rb +151 -78
- data/spec/active_record/connection_adapters/oracle_enhanced_database_tasks_spec.rb +4 -4
- data/spec/active_record/connection_adapters/oracle_enhanced_dirty_spec.rb +10 -16
- data/spec/active_record/connection_adapters/oracle_enhanced_emulate_oracle_adapter_spec.rb +1 -1
- data/spec/active_record/connection_adapters/oracle_enhanced_procedures_spec.rb +5 -5
- data/spec/active_record/connection_adapters/oracle_enhanced_schema_dump_spec.rb +65 -181
- data/spec/active_record/connection_adapters/oracle_enhanced_schema_statements_spec.rb +114 -11
- data/spec/active_record/connection_adapters/oracle_enhanced_structure_dump_spec.rb +17 -1
- data/spec/spec_config.yaml.template +11 -0
- data/spec/spec_helper.rb +31 -12
- data/spec/support/alter_system_user_password.sql +2 -0
- data/spec/support/create_oracle_enhanced_users.sql +31 -0
- metadata +37 -27
- data/lib/active_record/connection_adapters/oracle_enhanced_column_dumper.rb +0 -77
- data/lib/active_record/connection_adapters/oracle_enhanced_context_index.rb +0 -350
- data/lib/active_record/connection_adapters/oracle_enhanced_database_statements.rb +0 -262
- data/lib/active_record/connection_adapters/oracle_enhanced_dirty.rb +0 -45
- data/lib/active_record/connection_adapters/oracle_enhanced_schema_definitions.rb +0 -197
- data/lib/active_record/connection_adapters/oracle_enhanced_schema_statements.rb +0 -450
- data/lib/active_record/connection_adapters/oracle_enhanced_schema_statements_ext.rb +0 -258
- data/lib/active_record/connection_adapters/oracle_enhanced_version.rb +0 -1
- /data/lib/active_record/connection_adapters/{oracle_enhanced_cpk.rb → oracle_enhanced/cpk.rb} +0 -0
- /data/lib/active_record/connection_adapters/{oracle_enhanced_database_tasks.rb → oracle_enhanced/database_tasks.rb} +0 -0
@@ -22,7 +22,7 @@ describe "OracleEnhancedAdapter schema dump" do
|
|
22
22
|
schema_define do
|
23
23
|
create_table :test_posts, options do |t|
|
24
24
|
t.string :title
|
25
|
-
t.timestamps
|
25
|
+
t.timestamps null: true
|
26
26
|
end
|
27
27
|
add_index :test_posts, :title
|
28
28
|
end
|
@@ -180,21 +180,21 @@ describe "OracleEnhancedAdapter schema dump" do
|
|
180
180
|
schema_define do
|
181
181
|
add_foreign_key :test_comments, :test_posts
|
182
182
|
end
|
183
|
-
standard_dump.should =~ /add_foreign_key "test_comments", "test_posts"
|
183
|
+
standard_dump.should =~ /add_foreign_key "test_comments", "test_posts"/
|
184
184
|
end
|
185
185
|
|
186
186
|
it "should include foreign key with delete dependency in schema dump" do
|
187
187
|
schema_define do
|
188
188
|
add_foreign_key :test_comments, :test_posts, dependent: :delete
|
189
189
|
end
|
190
|
-
standard_dump.should =~ /add_foreign_key "test_comments", "test_posts",
|
190
|
+
standard_dump.should =~ /add_foreign_key "test_comments", "test_posts", on_delete: :cascade/
|
191
191
|
end
|
192
192
|
|
193
193
|
it "should include foreign key with nullify dependency in schema dump" do
|
194
194
|
schema_define do
|
195
195
|
add_foreign_key :test_comments, :test_posts, dependent: :nullify
|
196
196
|
end
|
197
|
-
standard_dump.should =~ /add_foreign_key "test_comments", "test_posts",
|
197
|
+
standard_dump.should =~ /add_foreign_key "test_comments", "test_posts", on_delete: :nullify/
|
198
198
|
end
|
199
199
|
|
200
200
|
it "should not include foreign keys on ignored table names in schema dump" do
|
@@ -226,6 +226,7 @@ describe "OracleEnhancedAdapter schema dump" do
|
|
226
226
|
end
|
227
227
|
|
228
228
|
it "should include composite foreign keys" do
|
229
|
+
skip "Composite foreign keys are not supported in this version"
|
229
230
|
schema_define do
|
230
231
|
add_column :test_posts, :baz_id, :integer
|
231
232
|
add_column :test_posts, :fooz_id, :integer
|
@@ -340,7 +341,7 @@ describe "OracleEnhancedAdapter schema dump" do
|
|
340
341
|
|
341
342
|
it "should specify non-default tablespace in add index" do
|
342
343
|
tablespace_name = @conn.default_tablespace
|
343
|
-
@conn.stub
|
344
|
+
@conn.stub(:default_tablespace).and_return('dummy')
|
344
345
|
create_test_posts_table
|
345
346
|
standard_dump.should =~ /add_index "test_posts", \["title"\], name: "index_test_posts_on_title", tablespace: "#{tablespace_name}"$/
|
346
347
|
end
|
@@ -368,21 +369,18 @@ describe "OracleEnhancedAdapter schema dump" do
|
|
368
369
|
|
369
370
|
describe 'virtual columns' do
|
370
371
|
before(:all) do
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
end
|
372
|
+
skip "Not supported in this database version" unless @oracle11g_or_higher
|
373
|
+
schema_define do
|
374
|
+
create_table :test_names, :force => true do |t|
|
375
|
+
t.string :first_name
|
376
|
+
t.string :last_name
|
377
|
+
t.virtual :full_name, :as => "first_name || ', ' || last_name"
|
378
|
+
t.virtual :short_name, :as => "COALESCE(first_name, last_name)", :type => :string, :limit => 300
|
379
|
+
t.virtual :abbrev_name, :as => "SUBSTR(first_name,1,50) || ' ' || SUBSTR(last_name,1,1) || '.'", :type => "VARCHAR(100)"
|
380
|
+
t.virtual :name_ratio, :as => '(LENGTH(first_name)*10/LENGTH(last_name)*10)'
|
381
|
+
t.column :full_name_length, :virtual, :as => "length(first_name || ', ' || last_name)", :type => :integer
|
382
|
+
t.virtual :field_with_leading_space, :as => "' ' || first_name || ' '", :limit => 300, :type => :string
|
383
383
|
end
|
384
|
-
else
|
385
|
-
pending "Not supported in this database version"
|
386
384
|
end
|
387
385
|
end
|
388
386
|
|
@@ -402,30 +400,13 @@ describe "OracleEnhancedAdapter schema dump" do
|
|
402
400
|
end
|
403
401
|
end
|
404
402
|
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
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
|
403
|
+
it 'should dump correctly' do
|
404
|
+
standard_dump.should =~ /t\.virtual "full_name",(\s*)limit: 512,(\s*)as: "\\"FIRST_NAME\\"\|\|', '\|\|\\"LAST_NAME\\"",(\s*)type: :string/
|
405
|
+
standard_dump.should =~ /t\.virtual "short_name",(\s*)limit: 300,(\s*)as:(.*),(\s*)type: :string/
|
406
|
+
standard_dump.should =~ /t\.virtual "full_name_length",(\s*)precision: 38,(\s*)as:(.*),(\s*)type: :integer/
|
407
|
+
standard_dump.should =~ /t\.virtual "name_ratio",(\s*)as:(.*)\"$/ # no :type
|
408
|
+
standard_dump.should =~ /t\.virtual "abbrev_name",(\s*)limit: 100,(\s*)as:(.*),(\s*)type: :string/
|
409
|
+
standard_dump.should =~ /t\.virtual "field_with_leading_space",(\s*)limit: 300,(\s*)as: "' '\|\|\\"FIRST_NAME\\"\|\|' '",(\s*)type: :string/
|
429
410
|
end
|
430
411
|
|
431
412
|
context 'with column cache' do
|
@@ -471,160 +452,63 @@ describe "OracleEnhancedAdapter schema dump" do
|
|
471
452
|
end
|
472
453
|
end
|
473
454
|
|
474
|
-
describe "
|
475
|
-
|
455
|
+
describe ":float datatype" do
|
456
|
+
before(:each) do
|
476
457
|
schema_define do
|
477
|
-
|
478
|
-
|
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
|
458
|
+
create_table :test_floats, force: true do |t|
|
459
|
+
t.float :hourly_rate
|
490
460
|
end
|
491
461
|
end
|
462
|
+
end
|
492
463
|
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
it "should dump correctly" do
|
497
|
-
standard_dump.should =~ /t\.float "value"$/
|
498
|
-
end
|
464
|
+
after(:each) do
|
465
|
+
schema_define do
|
466
|
+
drop_table :test_floats
|
499
467
|
end
|
468
|
+
end
|
500
469
|
|
501
|
-
|
502
|
-
|
470
|
+
it "should dump float type correctly" do
|
471
|
+
standard_dump.should =~ /t\.float "hourly_rate"$/
|
472
|
+
end
|
473
|
+
end
|
503
474
|
|
504
|
-
|
505
|
-
|
475
|
+
describe "table comments" do
|
476
|
+
before(:each) do
|
477
|
+
schema_define do
|
478
|
+
create_table :test_table_comments, :comment => "this is a \"table comment\"!", force: true do |t|
|
479
|
+
t.string :blah
|
506
480
|
end
|
507
481
|
end
|
508
482
|
end
|
509
483
|
|
510
|
-
|
511
|
-
|
512
|
-
|
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
|
484
|
+
after(:each) do
|
485
|
+
schema_define do
|
486
|
+
drop_table :test_table_comments
|
524
487
|
end
|
488
|
+
end
|
525
489
|
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
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!
|
490
|
+
it "should dump table comments" do
|
491
|
+
standard_dump.should =~ /comment: "this is a \\"table comment\\"!"/
|
492
|
+
end
|
493
|
+
end
|
568
494
|
|
569
|
-
|
570
|
-
|
571
|
-
|
495
|
+
describe "column comments" do
|
496
|
+
before(:each) do
|
497
|
+
schema_define do
|
498
|
+
create_table :test_column_comments, force: true do |t|
|
499
|
+
t.string :blah, :comment => "this is a \"column comment\"!"
|
572
500
|
end
|
573
501
|
end
|
502
|
+
end
|
574
503
|
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
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)
|
504
|
+
after(:each) do
|
505
|
+
schema_define do
|
506
|
+
drop_table :test_column_comments
|
507
|
+
end
|
508
|
+
end
|
629
509
|
|
510
|
+
it "should dump column comments" do
|
511
|
+
standard_dump.should =~ /comment: "this is a \\"column comment\\"!"/
|
512
|
+
end
|
513
|
+
end
|
630
514
|
end
|
@@ -423,6 +423,7 @@ describe "OracleEnhancedAdapter schema definition" do
|
|
423
423
|
drop_table :new_test_employees rescue nil
|
424
424
|
drop_table :test_employees_no_pkey rescue nil
|
425
425
|
drop_table :new_test_employees_no_pkey rescue nil
|
426
|
+
drop_table :aaaaaaaaaaaaaaaaaaaaaaaaaaa rescue nil
|
426
427
|
end
|
427
428
|
end
|
428
429
|
|
@@ -438,10 +439,10 @@ describe "OracleEnhancedAdapter schema definition" do
|
|
438
439
|
end.should raise_error
|
439
440
|
end
|
440
441
|
|
441
|
-
it "should raise error when new sequence name length is too long" do
|
442
|
+
it "should not raise error when new sequence name length is too long" do
|
442
443
|
lambda do
|
443
444
|
@conn.rename_table("test_employees","a"*27)
|
444
|
-
end.
|
445
|
+
end.should_not raise_error
|
445
446
|
end
|
446
447
|
|
447
448
|
it "should rename table when table has no primary key and sequence" do
|
@@ -627,25 +628,28 @@ end
|
|
627
628
|
end
|
628
629
|
|
629
630
|
it "should add foreign key" do
|
631
|
+
fk_name = "fk_rails_#{Digest::SHA256.hexdigest("test_comments_test_post_id_fk").first(10)}"
|
632
|
+
|
630
633
|
schema_define do
|
631
634
|
add_foreign_key :test_comments, :test_posts
|
632
635
|
end
|
633
636
|
lambda do
|
634
637
|
TestComment.create(:body => "test", :test_post_id => 1)
|
635
|
-
end.should raise_error() {|e| e.message.should =~ /ORA-02291
|
638
|
+
end.should raise_error() {|e| e.message.should =~ /ORA-02291.*\.#{fk_name}/i}
|
636
639
|
end
|
637
640
|
|
638
641
|
context "with table_name_prefix" do
|
639
642
|
let(:table_name_prefix) { 'xxx_' }
|
640
643
|
|
641
644
|
it "should use table_name_prefix for foreign table" do
|
645
|
+
fk_name = "fk_rails_#{Digest::SHA256.hexdigest("xxx_test_comments_test_post_id_fk").first(10)}"
|
642
646
|
schema_define do
|
643
647
|
add_foreign_key :test_comments, :test_posts
|
644
648
|
end
|
645
649
|
|
646
650
|
lambda do
|
647
651
|
TestComment.create(:body => "test", :test_post_id => 1)
|
648
|
-
end.should raise_error() {|e| e.message.should =~ /ORA-02291
|
652
|
+
end.should raise_error() {|e| e.message.should =~ /ORA-02291.*\.#{fk_name}/i}
|
649
653
|
end
|
650
654
|
end
|
651
655
|
|
@@ -653,13 +657,14 @@ end
|
|
653
657
|
let(:table_name_suffix) { '_xxx' }
|
654
658
|
|
655
659
|
it "should use table_name_suffix for foreign table" do
|
660
|
+
fk_name = "fk_rails_#{Digest::SHA256.hexdigest("test_comments_xxx_test_post_id_fk").first(10)}"
|
656
661
|
schema_define do
|
657
662
|
add_foreign_key :test_comments, :test_posts
|
658
663
|
end
|
659
664
|
|
660
665
|
lambda do
|
661
666
|
TestComment.create(:body => "test", :test_post_id => 1)
|
662
|
-
end.should raise_error() {|e| e.message.should =~ /ORA-02291
|
667
|
+
end.should raise_error() {|e| e.message.should =~ /ORA-02291.*\.#{fk_name}/i}
|
663
668
|
end
|
664
669
|
end
|
665
670
|
|
@@ -678,7 +683,8 @@ end
|
|
678
683
|
end
|
679
684
|
lambda do
|
680
685
|
TestComment.create(:body => "test", :test_post_id => 1)
|
681
|
-
end.should raise_error() {|e| e.message.should =~
|
686
|
+
end.should raise_error() {|e| e.message.should =~
|
687
|
+
/ORA-02291.*\.C#{Digest::SHA1.hexdigest("test_comments_test_post_id_foreign_key")[0,29].upcase}/}
|
682
688
|
end
|
683
689
|
|
684
690
|
it "should add foreign key with very long name which is shortened" do
|
@@ -692,12 +698,14 @@ end
|
|
692
698
|
end
|
693
699
|
|
694
700
|
it "should add foreign key with column" do
|
701
|
+
fk_name = "fk_rails_#{Digest::SHA256.hexdigest("test_comments_post_id_fk").first(10)}"
|
702
|
+
|
695
703
|
schema_define do
|
696
704
|
add_foreign_key :test_comments, :test_posts, :column => "post_id"
|
697
705
|
end
|
698
706
|
lambda do
|
699
707
|
TestComment.create(:body => "test", :post_id => 1)
|
700
|
-
end.should raise_error() {|e| e.message.should =~ /ORA-02291
|
708
|
+
end.should raise_error() {|e| e.message.should =~ /ORA-02291.*\.#{fk_name}/i}
|
701
709
|
end
|
702
710
|
|
703
711
|
it "should add foreign key with delete dependency" do
|
@@ -721,6 +729,7 @@ end
|
|
721
729
|
end
|
722
730
|
|
723
731
|
it "should add a composite foreign key" do
|
732
|
+
skip "Composite foreign keys are not supported in this version"
|
724
733
|
schema_define do
|
725
734
|
add_column :test_posts, :baz_id, :integer
|
726
735
|
add_column :test_posts, :fooz_id, :integer
|
@@ -743,6 +752,7 @@ end
|
|
743
752
|
end
|
744
753
|
|
745
754
|
it "should add a composite foreign key with name" do
|
755
|
+
skip "Composite foreign keys are not supported in this version"
|
746
756
|
schema_define do
|
747
757
|
add_column :test_posts, :baz_id, :integer
|
748
758
|
add_column :test_posts, :fooz_id, :integer
|
@@ -795,6 +805,92 @@ end
|
|
795
805
|
|
796
806
|
end
|
797
807
|
|
808
|
+
describe "lob in table definition" do
|
809
|
+
before do
|
810
|
+
class ::TestPost < ActiveRecord::Base
|
811
|
+
end
|
812
|
+
end
|
813
|
+
it 'should use default tablespace for clobs' do
|
814
|
+
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.default_tablespaces[:clob] = DATABASE_NON_DEFAULT_TABLESPACE
|
815
|
+
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.default_tablespaces[:blob] = nil
|
816
|
+
schema_define do
|
817
|
+
create_table :test_posts, :force => true do |t|
|
818
|
+
t.text :test_clob
|
819
|
+
t.binary :test_blob
|
820
|
+
end
|
821
|
+
end
|
822
|
+
TestPost.connection.select_value("SELECT tablespace_name FROM user_lobs WHERE table_name='TEST_POSTS' and column_name = 'TEST_CLOB'").should == DATABASE_NON_DEFAULT_TABLESPACE
|
823
|
+
TestPost.connection.select_value("SELECT tablespace_name FROM user_lobs WHERE table_name='TEST_POSTS' and column_name = 'TEST_BLOB'").should_not == DATABASE_NON_DEFAULT_TABLESPACE
|
824
|
+
end
|
825
|
+
|
826
|
+
it 'should use default tablespace for blobs' do
|
827
|
+
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.default_tablespaces[:blob] = DATABASE_NON_DEFAULT_TABLESPACE
|
828
|
+
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.default_tablespaces[:clob] = nil
|
829
|
+
schema_define do
|
830
|
+
create_table :test_posts, :force => true do |t|
|
831
|
+
t.text :test_clob
|
832
|
+
t.binary :test_blob
|
833
|
+
end
|
834
|
+
end
|
835
|
+
TestPost.connection.select_value("SELECT tablespace_name FROM user_lobs WHERE table_name='TEST_POSTS' and column_name = 'TEST_BLOB'").should == DATABASE_NON_DEFAULT_TABLESPACE
|
836
|
+
TestPost.connection.select_value("SELECT tablespace_name FROM user_lobs WHERE table_name='TEST_POSTS' and column_name = 'TEST_CLOB'").should_not == DATABASE_NON_DEFAULT_TABLESPACE
|
837
|
+
end
|
838
|
+
|
839
|
+
after do
|
840
|
+
Object.send(:remove_const, "TestPost")
|
841
|
+
schema_define do
|
842
|
+
drop_table :test_posts rescue nil
|
843
|
+
end
|
844
|
+
end
|
845
|
+
end
|
846
|
+
|
847
|
+
describe "primary key in table definition" do
|
848
|
+
before do
|
849
|
+
@conn = ActiveRecord::Base.connection
|
850
|
+
|
851
|
+
class ::TestPost < ActiveRecord::Base
|
852
|
+
end
|
853
|
+
end
|
854
|
+
|
855
|
+
it 'should use default tablespace for primary key' do
|
856
|
+
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.default_tablespaces[:index] = nil
|
857
|
+
schema_define do
|
858
|
+
create_table :test_posts, :force => true
|
859
|
+
end
|
860
|
+
|
861
|
+
index_name = @conn.select_value(
|
862
|
+
"SELECT index_name FROM all_constraints
|
863
|
+
WHERE table_name = 'TEST_POSTS'
|
864
|
+
AND constraint_type = 'P'
|
865
|
+
AND owner = SYS_CONTEXT('userenv', 'current_schema')")
|
866
|
+
|
867
|
+
expect(TestPost.connection.select_value("SELECT tablespace_name FROM user_indexes WHERE index_name = '#{index_name}'")).to eq('USERS')
|
868
|
+
end
|
869
|
+
|
870
|
+
it 'should use non default tablespace for primary key' do
|
871
|
+
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.default_tablespaces[:index] = DATABASE_NON_DEFAULT_TABLESPACE
|
872
|
+
schema_define do
|
873
|
+
create_table :test_posts, :force => true
|
874
|
+
end
|
875
|
+
|
876
|
+
index_name = @conn.select_value(
|
877
|
+
"SELECT index_name FROM all_constraints
|
878
|
+
WHERE table_name = 'TEST_POSTS'
|
879
|
+
AND constraint_type = 'P'
|
880
|
+
AND owner = SYS_CONTEXT('userenv', 'current_schema')")
|
881
|
+
|
882
|
+
expect(TestPost.connection.select_value("SELECT tablespace_name FROM user_indexes WHERE index_name = '#{index_name}'")).to eq(DATABASE_NON_DEFAULT_TABLESPACE)
|
883
|
+
end
|
884
|
+
|
885
|
+
after do
|
886
|
+
Object.send(:remove_const, "TestPost")
|
887
|
+
schema_define do
|
888
|
+
drop_table :test_posts rescue nil
|
889
|
+
end
|
890
|
+
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.default_tablespaces[:index] = nil
|
891
|
+
end
|
892
|
+
end
|
893
|
+
|
798
894
|
describe "foreign key in table definition" do
|
799
895
|
before(:each) do
|
800
896
|
schema_define do
|
@@ -1020,7 +1116,7 @@ end
|
|
1020
1116
|
end
|
1021
1117
|
end
|
1022
1118
|
class ::TestPost < ActiveRecord::Base; end
|
1023
|
-
TestPost.columns_hash['title'].null.should
|
1119
|
+
TestPost.columns_hash['title'].null.should be false
|
1024
1120
|
end
|
1025
1121
|
|
1026
1122
|
after(:each) do
|
@@ -1034,7 +1130,7 @@ end
|
|
1034
1130
|
change_column :test_posts, :title, :string, :null => true
|
1035
1131
|
end
|
1036
1132
|
TestPost.reset_column_information
|
1037
|
-
TestPost.columns_hash['title'].null.should
|
1133
|
+
TestPost.columns_hash['title'].null.should be true
|
1038
1134
|
end
|
1039
1135
|
|
1040
1136
|
it "should add column" do
|
@@ -1110,7 +1206,7 @@ end
|
|
1110
1206
|
|
1111
1207
|
describe 'virtual columns in create_table' do
|
1112
1208
|
before(:each) do
|
1113
|
-
|
1209
|
+
skip "Not supported in this database version" unless @oracle11g_or_higher
|
1114
1210
|
end
|
1115
1211
|
|
1116
1212
|
it 'should create virtual column with old syntax' do
|
@@ -1156,7 +1252,7 @@ end
|
|
1156
1252
|
|
1157
1253
|
describe 'virtual columns' do
|
1158
1254
|
before(:each) do
|
1159
|
-
|
1255
|
+
skip "Not supported in this database version" unless @oracle11g_or_higher
|
1160
1256
|
expr = "( numerator/NULLIF(denominator,0) )*100"
|
1161
1257
|
schema_define do
|
1162
1258
|
create_table :test_fractions, :force => true do |t|
|
@@ -1359,6 +1455,13 @@ end
|
|
1359
1455
|
@would_execute_sql.should =~ /CREATE +INDEX .* ON .* \(.*\) TABLESPACE #{DATABASE_NON_DEFAULT_TABLESPACE}/
|
1360
1456
|
end
|
1361
1457
|
|
1458
|
+
it "should create unique function index but not create unique constraints" do
|
1459
|
+
schema_define do
|
1460
|
+
add_index :keyboards, 'lower(name)', unique: true, name: :index_keyboards_on_lower_name
|
1461
|
+
end
|
1462
|
+
@would_execute_sql.should_not =~ /ALTER +TABLE .* ADD CONSTRAINT .* UNIQUE \(.*\(.*\)\)/
|
1463
|
+
end
|
1464
|
+
|
1362
1465
|
describe "#initialize_schema_migrations_table" do
|
1363
1466
|
# In Rails 2.3 to 3.2.x the index name for the migrations
|
1364
1467
|
# table is hard-coded. We can modify the index name here
|
@@ -92,6 +92,7 @@ describe "OracleEnhancedAdapter structure dump" do
|
|
92
92
|
end
|
93
93
|
|
94
94
|
it "should dump composite foreign keys" do
|
95
|
+
skip "Composite foreign keys are not supported in this version"
|
95
96
|
@conn.add_column :foos, :fooz_id, :integer
|
96
97
|
@conn.add_column :foos, :baz_id, :integer
|
97
98
|
|
@@ -149,7 +150,7 @@ describe "OracleEnhancedAdapter structure dump" do
|
|
149
150
|
end
|
150
151
|
|
151
152
|
it "should dump virtual columns" do
|
152
|
-
|
153
|
+
skip "Not supported in this database version" unless @oracle11g_or_higher
|
153
154
|
@conn.execute <<-SQL
|
154
155
|
CREATE TABLE bars (
|
155
156
|
id NUMBER(38,0) NOT NULL,
|
@@ -162,6 +163,7 @@ describe "OracleEnhancedAdapter structure dump" do
|
|
162
163
|
end
|
163
164
|
|
164
165
|
it "should dump RAW virtual columns" do
|
166
|
+
skip "Not supported in this database version" unless @oracle11g_or_higher
|
165
167
|
@conn.execute <<-SQL
|
166
168
|
CREATE TABLE bars (
|
167
169
|
id NUMBER(38,0) NOT NULL,
|
@@ -224,6 +226,20 @@ describe "OracleEnhancedAdapter structure dump" do
|
|
224
226
|
dump.should =~ /CREATE TABLE \"BARS\" \(\n\"ID\" NUMBER\(38,0\) NOT NULL,\n \"SUPER\" RAW\(255\)/
|
225
227
|
end
|
226
228
|
|
229
|
+
it "should dump table comments" do
|
230
|
+
comment_sql = %Q(COMMENT ON TABLE "TEST_POSTS" IS 'Test posts with ''some'' "quotes"')
|
231
|
+
@conn.execute comment_sql
|
232
|
+
dump = ActiveRecord::Base.connection.structure_dump
|
233
|
+
dump.should =~ /#{comment_sql}/
|
234
|
+
end
|
235
|
+
|
236
|
+
it "should dump column comments" do
|
237
|
+
comment_sql = %Q(COMMENT ON COLUMN "TEST_POSTS"."TITLE" IS 'The title of the post with ''some'' "quotes"')
|
238
|
+
@conn.execute comment_sql
|
239
|
+
dump = ActiveRecord::Base.connection.structure_dump
|
240
|
+
dump.should =~ /#{comment_sql}/
|
241
|
+
end
|
242
|
+
|
227
243
|
end
|
228
244
|
describe "temporary tables" do
|
229
245
|
after(:all) do
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# copy this file to spec/config.yaml and set appropriate values
|
2
|
+
# you can also use environment variables, see spec_helper.rb
|
3
|
+
database:
|
4
|
+
name: 'orcl'
|
5
|
+
host: '127.0.0.1'
|
6
|
+
port: 1521
|
7
|
+
user: 'oracle_enhanced'
|
8
|
+
password: 'oracle_enhanced'
|
9
|
+
sys_password: 'admin'
|
10
|
+
non_default_tablespace: 'SYSTEM'
|
11
|
+
timezone: 'Europe/Riga'
|