activerecord-oracle_enhanced-adapter 1.5.6 → 1.6.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +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'
|