activerecord-oracle_enhanced-adapter 5.2.8 → 7.0.3
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/History.md +390 -21
- data/README.md +35 -8
- data/VERSION +1 -1
- data/lib/active_record/connection_adapters/emulation/oracle_adapter.rb +1 -1
- data/lib/active_record/connection_adapters/oracle_enhanced/column.rb +3 -3
- data/lib/active_record/connection_adapters/oracle_enhanced/connection.rb +42 -37
- data/lib/active_record/connection_adapters/oracle_enhanced/context_index.rb +59 -60
- data/lib/active_record/connection_adapters/oracle_enhanced/database_limits.rb +5 -10
- data/lib/active_record/connection_adapters/oracle_enhanced/database_statements.rb +86 -81
- data/lib/active_record/connection_adapters/oracle_enhanced/database_tasks.rb +9 -10
- data/lib/active_record/connection_adapters/oracle_enhanced/dbms_output.rb +1 -2
- data/lib/active_record/connection_adapters/oracle_enhanced/jdbc_connection.rb +37 -16
- data/lib/active_record/connection_adapters/oracle_enhanced/jdbc_quoting.rb +1 -1
- data/lib/active_record/connection_adapters/oracle_enhanced/lob.rb +5 -6
- data/lib/active_record/connection_adapters/oracle_enhanced/oci_connection.rb +58 -49
- data/lib/active_record/connection_adapters/oracle_enhanced/oci_quoting.rb +1 -1
- data/lib/active_record/connection_adapters/oracle_enhanced/procedures.rb +6 -7
- data/lib/active_record/connection_adapters/oracle_enhanced/quoting.rb +75 -51
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_creation.rb +13 -14
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_definitions.rb +14 -4
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_dumper.rb +27 -24
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_statements.rb +156 -155
- data/lib/active_record/connection_adapters/oracle_enhanced/structure_dump.rb +103 -90
- data/lib/active_record/connection_adapters/oracle_enhanced/type_metadata.rb +3 -2
- data/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb +261 -161
- data/lib/active_record/type/oracle_enhanced/boolean.rb +0 -1
- data/lib/active_record/type/oracle_enhanced/character_string.rb +36 -0
- data/lib/active_record/type/oracle_enhanced/integer.rb +0 -1
- data/lib/arel/visitors/oracle.rb +221 -0
- data/lib/arel/visitors/oracle12.rb +128 -0
- data/spec/active_record/connection_adapters/emulation/oracle_adapter_spec.rb +0 -2
- data/spec/active_record/connection_adapters/oracle_enhanced/connection_spec.rb +78 -26
- data/spec/active_record/connection_adapters/oracle_enhanced/context_index_spec.rb +7 -15
- data/spec/active_record/connection_adapters/oracle_enhanced/database_tasks_spec.rb +5 -0
- data/spec/active_record/connection_adapters/oracle_enhanced/dbms_output_spec.rb +17 -17
- data/spec/active_record/connection_adapters/oracle_enhanced/procedures_spec.rb +7 -10
- data/spec/active_record/connection_adapters/oracle_enhanced/quoting_spec.rb +0 -15
- data/spec/active_record/connection_adapters/oracle_enhanced/schema_dumper_spec.rb +33 -36
- data/spec/active_record/connection_adapters/oracle_enhanced/schema_statements_spec.rb +77 -258
- data/spec/active_record/connection_adapters/oracle_enhanced/structure_dump_spec.rb +38 -39
- data/spec/active_record/connection_adapters/oracle_enhanced_adapter_spec.rb +273 -85
- data/spec/active_record/connection_adapters/oracle_enhanced_data_types_spec.rb +7 -8
- data/spec/active_record/oracle_enhanced/type/boolean_spec.rb +2 -4
- data/spec/active_record/oracle_enhanced/type/character_string_spec.rb +43 -0
- data/spec/active_record/oracle_enhanced/type/custom_spec.rb +90 -0
- data/spec/active_record/oracle_enhanced/type/decimal_spec.rb +56 -0
- data/spec/active_record/oracle_enhanced/type/dirty_spec.rb +1 -1
- data/spec/active_record/oracle_enhanced/type/integer_spec.rb +2 -2
- data/spec/active_record/oracle_enhanced/type/json_spec.rb +0 -1
- data/spec/active_record/oracle_enhanced/type/national_character_string_spec.rb +6 -5
- data/spec/active_record/oracle_enhanced/type/timestamp_spec.rb +2 -4
- data/spec/spec_config.yaml.template +2 -2
- data/spec/spec_helper.rb +13 -2
- metadata +52 -30
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_statements_ext.rb +0 -28
@@ -59,7 +59,6 @@ describe "OracleEnhancedAdapter" do
|
|
59
59
|
end
|
60
60
|
|
61
61
|
describe "without column caching" do
|
62
|
-
|
63
62
|
it "should identify virtual columns as such" do
|
64
63
|
skip "Not supported in this database version" unless @conn.supports_virtual_columns?
|
65
64
|
te = TestEmployee.connection.columns("test_employees").detect(&:virtual?)
|
@@ -100,64 +99,14 @@ describe "OracleEnhancedAdapter" do
|
|
100
99
|
|
101
100
|
it "should get sequence value at next time" do
|
102
101
|
TestEmployee.create!
|
103
|
-
expect(@logger.logged(:debug).first).not_to match(/SELECT
|
102
|
+
expect(@logger.logged(:debug).first).not_to match(/SELECT "TEST_EMPLOYEES_SEQ".NEXTVAL FROM dual/im)
|
104
103
|
@logger.clear(:debug)
|
105
104
|
TestEmployee.create!
|
106
|
-
expect(@logger.logged(:debug).first).to match(/SELECT
|
105
|
+
expect(@logger.logged(:debug).first).to match(/SELECT "TEST_EMPLOYEES_SEQ".NEXTVAL FROM dual/im)
|
107
106
|
end
|
108
107
|
end
|
109
108
|
end
|
110
109
|
|
111
|
-
describe "access table over database link" do
|
112
|
-
before(:all) do
|
113
|
-
@conn = ActiveRecord::Base.connection
|
114
|
-
@db_link = "db_link"
|
115
|
-
@sys_conn = ActiveRecord::Base.oracle_enhanced_connection(SYSTEM_CONNECTION_PARAMS)
|
116
|
-
@sys_conn.drop_table :test_posts, if_exists: true
|
117
|
-
@sys_conn.create_table :test_posts do |t|
|
118
|
-
t.string :title
|
119
|
-
# cannot update LOBs over database link
|
120
|
-
t.string :body
|
121
|
-
t.timestamps null: true
|
122
|
-
end
|
123
|
-
@db_link_username = SYSTEM_CONNECTION_PARAMS[:username]
|
124
|
-
@db_link_password = SYSTEM_CONNECTION_PARAMS[:password]
|
125
|
-
@db_link_database = SYSTEM_CONNECTION_PARAMS[:database]
|
126
|
-
@conn.execute "DROP DATABASE LINK #{@db_link}" rescue nil
|
127
|
-
@conn.execute "CREATE DATABASE LINK #{@db_link} CONNECT TO #{@db_link_username} IDENTIFIED BY \"#{@db_link_password}\" USING '#{@db_link_database}'"
|
128
|
-
@conn.execute "CREATE OR REPLACE SYNONYM test_posts FOR test_posts@#{@db_link}"
|
129
|
-
@conn.execute "CREATE OR REPLACE SYNONYM test_posts_seq FOR test_posts_seq@#{@db_link}"
|
130
|
-
class ::TestPost < ActiveRecord::Base
|
131
|
-
end
|
132
|
-
TestPost.table_name = "test_posts"
|
133
|
-
end
|
134
|
-
|
135
|
-
after(:all) do
|
136
|
-
@conn.execute "DROP SYNONYM test_posts"
|
137
|
-
@conn.execute "DROP SYNONYM test_posts_seq"
|
138
|
-
@conn.execute "DROP DATABASE LINK #{@db_link}" rescue nil
|
139
|
-
@sys_conn.drop_table :test_posts, if_exists: true
|
140
|
-
Object.send(:remove_const, "TestPost") rescue nil
|
141
|
-
@conn.clear_table_columns_cache(:test_posts)
|
142
|
-
ActiveRecord::Base.clear_cache!
|
143
|
-
end
|
144
|
-
|
145
|
-
it "should verify database link" do
|
146
|
-
@conn.select_value("select * from dual@#{@db_link}") == "X"
|
147
|
-
end
|
148
|
-
|
149
|
-
it "should get column names" do
|
150
|
-
expect(TestPost.column_names).to eq(["id", "title", "body", "created_at", "updated_at"])
|
151
|
-
end
|
152
|
-
|
153
|
-
it "should create record" do
|
154
|
-
p = TestPost.create(title: "Title", body: "Body")
|
155
|
-
expect(p.id).not_to be_nil
|
156
|
-
expect(TestPost.find(p.id)).not_to be_nil
|
157
|
-
end
|
158
|
-
|
159
|
-
end
|
160
|
-
|
161
110
|
describe "session information" do
|
162
111
|
before(:all) do
|
163
112
|
@conn = ActiveRecord::Base.connection
|
@@ -201,6 +150,45 @@ describe "OracleEnhancedAdapter" do
|
|
201
150
|
end
|
202
151
|
end
|
203
152
|
|
153
|
+
describe "`has_many` assoc has `dependent: :delete_all` with `order`" do
|
154
|
+
before(:all) do
|
155
|
+
schema_define do
|
156
|
+
create_table :test_posts do |t|
|
157
|
+
t.string :title
|
158
|
+
end
|
159
|
+
create_table :test_comments do |t|
|
160
|
+
t.integer :test_post_id
|
161
|
+
t.string :description
|
162
|
+
end
|
163
|
+
add_index :test_comments, :test_post_id
|
164
|
+
end
|
165
|
+
class ::TestPost < ActiveRecord::Base
|
166
|
+
has_many :test_comments, -> { order(:id) }, dependent: :delete_all
|
167
|
+
end
|
168
|
+
class ::TestComment < ActiveRecord::Base
|
169
|
+
belongs_to :test_post
|
170
|
+
end
|
171
|
+
TestPost.transaction do
|
172
|
+
post = TestPost.create!(title: "Title")
|
173
|
+
TestComment.create!(test_post_id: post.id, description: "Description")
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
after(:all) do
|
178
|
+
schema_define do
|
179
|
+
drop_table :test_comments
|
180
|
+
drop_table :test_posts
|
181
|
+
end
|
182
|
+
Object.send(:remove_const, "TestPost")
|
183
|
+
Object.send(:remove_const, "TestComment")
|
184
|
+
ActiveRecord::Base.clear_cache!
|
185
|
+
end
|
186
|
+
|
187
|
+
it "should not occur `ActiveRecord::StatementInvalid: OCIError: ORA-00907: missing right parenthesis`" do
|
188
|
+
expect { TestPost.first.destroy }.not_to raise_error
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
204
192
|
describe "eager loading" do
|
205
193
|
before(:all) do
|
206
194
|
schema_define do
|
@@ -242,7 +230,46 @@ describe "OracleEnhancedAdapter" do
|
|
242
230
|
posts = TestPost.includes(:test_comments).to_a
|
243
231
|
expect(posts.size).to eq(@ids.size)
|
244
232
|
end
|
233
|
+
end
|
234
|
+
|
235
|
+
describe "lists" do
|
236
|
+
before(:all) do
|
237
|
+
schema_define do
|
238
|
+
create_table :test_posts do |t|
|
239
|
+
t.string :title
|
240
|
+
end
|
241
|
+
end
|
242
|
+
class ::TestPost < ActiveRecord::Base
|
243
|
+
has_many :test_comments
|
244
|
+
end
|
245
|
+
@ids = (1..1010).to_a
|
246
|
+
TestPost.transaction do
|
247
|
+
@ids.each do |id|
|
248
|
+
TestPost.create!(id: id, title: "Title #{id}")
|
249
|
+
end
|
250
|
+
end
|
251
|
+
end
|
245
252
|
|
253
|
+
after(:all) do
|
254
|
+
schema_define do
|
255
|
+
drop_table :test_posts
|
256
|
+
end
|
257
|
+
Object.send(:remove_const, "TestPost")
|
258
|
+
ActiveRecord::Base.clear_cache!
|
259
|
+
end
|
260
|
+
|
261
|
+
##
|
262
|
+
# See this GitHub issue for an explanation of homogenous lists.
|
263
|
+
# https://github.com/rails/rails/commit/72fd0bae5948c1169411941aeea6fef4c58f34a9
|
264
|
+
it "should allow more than 1000 items in a list where the list is homogenous" do
|
265
|
+
posts = TestPost.where(id: @ids).to_a
|
266
|
+
expect(posts.size).to eq(@ids.size)
|
267
|
+
end
|
268
|
+
|
269
|
+
it "should allow more than 1000 items in a list where the list is non-homogenous" do
|
270
|
+
posts = TestPost.where(id: [*@ids, nil]).to_a
|
271
|
+
expect(posts.size).to eq(@ids.size)
|
272
|
+
end
|
246
273
|
end
|
247
274
|
|
248
275
|
describe "with statement pool" do
|
@@ -296,6 +323,14 @@ describe "OracleEnhancedAdapter" do
|
|
296
323
|
end
|
297
324
|
end
|
298
325
|
|
326
|
+
describe "database_exists?" do
|
327
|
+
it "should raise `NotImplementedError`" do
|
328
|
+
expect {
|
329
|
+
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.database_exists?(CONNECTION_PARAMS)
|
330
|
+
}.to raise_error(NotImplementedError)
|
331
|
+
end
|
332
|
+
end
|
333
|
+
|
299
334
|
describe "explain" do
|
300
335
|
before(:all) do
|
301
336
|
@conn = ActiveRecord::Base.connection
|
@@ -343,12 +378,11 @@ describe "OracleEnhancedAdapter" do
|
|
343
378
|
@employee = Class.new(ActiveRecord::Base) do
|
344
379
|
self.table_name = :test_employees
|
345
380
|
end
|
346
|
-
|
347
|
-
@employee.create!(sort_order:
|
348
|
-
@employee.create!(sort_order:
|
349
|
-
@employee.create!(sort_order:
|
350
|
-
@employee.create!(sort_order:
|
351
|
-
@employee.create!(sort_order: i += 1, first_name: "Natasha", last_name: "Romanova")
|
381
|
+
@employee.create!(sort_order: 1, first_name: "Peter", last_name: "Parker")
|
382
|
+
@employee.create!(sort_order: 2, first_name: "Tony", last_name: "Stark")
|
383
|
+
@employee.create!(sort_order: 3, first_name: "Steven", last_name: "Rogers")
|
384
|
+
@employee.create!(sort_order: 4, first_name: "Bruce", last_name: "Banner")
|
385
|
+
@employee.create!(sort_order: 5, first_name: "Natasha", last_name: "Romanova")
|
352
386
|
end
|
353
387
|
|
354
388
|
after(:all) do
|
@@ -445,6 +479,45 @@ describe "OracleEnhancedAdapter" do
|
|
445
479
|
end
|
446
480
|
end
|
447
481
|
|
482
|
+
describe "Binary lob column" do
|
483
|
+
before(:all) do
|
484
|
+
schema_define do
|
485
|
+
create_table :test_binary_columns do |t|
|
486
|
+
t.binary :attachment
|
487
|
+
end
|
488
|
+
end
|
489
|
+
class ::TestBinaryColumn < ActiveRecord::Base
|
490
|
+
end
|
491
|
+
end
|
492
|
+
|
493
|
+
after(:all) do
|
494
|
+
schema_define do
|
495
|
+
drop_table :test_binary_columns
|
496
|
+
end
|
497
|
+
Object.send(:remove_const, "TestBinaryColumn")
|
498
|
+
ActiveRecord::Base.table_name_prefix = nil
|
499
|
+
ActiveRecord::Base.clear_cache!
|
500
|
+
end
|
501
|
+
|
502
|
+
before(:each) do
|
503
|
+
set_logger
|
504
|
+
end
|
505
|
+
|
506
|
+
after(:each) do
|
507
|
+
clear_logger
|
508
|
+
end
|
509
|
+
|
510
|
+
it "should serialize with non UTF-8 data" do
|
511
|
+
binary_value = +"Hello \x93\xfa\x96\x7b"
|
512
|
+
binary_value.force_encoding "UTF-8"
|
513
|
+
|
514
|
+
binary_column_object = TestBinaryColumn.new
|
515
|
+
binary_column_object.attachment = binary_value
|
516
|
+
|
517
|
+
expect(binary_column_object.save!).to eq(true)
|
518
|
+
end
|
519
|
+
end
|
520
|
+
|
448
521
|
describe "quoting" do
|
449
522
|
before(:all) do
|
450
523
|
schema_define do
|
@@ -504,9 +577,29 @@ describe "OracleEnhancedAdapter" do
|
|
504
577
|
schema_define do
|
505
578
|
drop_table :test_posts, if_exists: true
|
506
579
|
create_table :test_posts
|
580
|
+
|
581
|
+
drop_table :users, if_exists: true
|
582
|
+
create_table :users, force: true do |t|
|
583
|
+
t.string :name
|
584
|
+
t.integer :group_id
|
585
|
+
end
|
586
|
+
|
587
|
+
drop_table :groups, if_exists: true
|
588
|
+
create_table :groups, force: true do |t|
|
589
|
+
t.string :name
|
590
|
+
end
|
507
591
|
end
|
592
|
+
|
508
593
|
class ::TestPost < ActiveRecord::Base
|
509
594
|
end
|
595
|
+
|
596
|
+
class User < ActiveRecord::Base
|
597
|
+
belongs_to :group
|
598
|
+
end
|
599
|
+
|
600
|
+
class Group < ActiveRecord::Base
|
601
|
+
has_one :user
|
602
|
+
end
|
510
603
|
end
|
511
604
|
|
512
605
|
before(:each) do
|
@@ -521,6 +614,8 @@ describe "OracleEnhancedAdapter" do
|
|
521
614
|
after(:all) do
|
522
615
|
schema_define do
|
523
616
|
drop_table :test_posts
|
617
|
+
drop_table :users
|
618
|
+
drop_table :groups
|
524
619
|
end
|
525
620
|
Object.send(:remove_const, "TestPost")
|
526
621
|
ActiveRecord::Base.clear_cache!
|
@@ -532,43 +627,37 @@ describe "OracleEnhancedAdapter" do
|
|
532
627
|
end
|
533
628
|
|
534
629
|
it "should return array from indexes with bind usage" do
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
it "should not have primary key trigger with bind usage" do
|
541
|
-
expect(@conn.has_primary_key_trigger?("TEST_POSTS")).to eq false
|
542
|
-
expect(@logger.logged(:debug).last).to match(/:owner/)
|
543
|
-
expect(@logger.logged(:debug).last).to match(/:table_name/)
|
544
|
-
expect(@logger.logged(:debug).last).to match(/\[\["owner", "#{DATABASE_USER.upcase}"\], \["trigger_name", "TEST_POSTS_PKT"\], \["owner", "#{DATABASE_USER.upcase}"\], \["table_name", "TEST_POSTS"\]\]/)
|
545
|
-
end
|
630
|
+
expect(@conn.indexes("TEST_POSTS").class).to eq Array
|
631
|
+
expect(@logger.logged(:debug).last).to match(/:table_name/)
|
632
|
+
expect(@logger.logged(:debug).last).to match(/\["table_name", "TEST_POSTS"\]/)
|
633
|
+
end
|
546
634
|
|
547
|
-
it "should return content from columns
|
635
|
+
it "should return content from columns witt bind usage" do
|
548
636
|
expect(@conn.columns("TEST_POSTS").length).to be > 0
|
549
|
-
expect(@logger.logged(:debug).last).
|
550
|
-
expect(@logger.logged(:debug).last).
|
551
|
-
expect(@logger.logged(:debug).last).not_to match(/\[\["owner", "#{DATABASE_USER.upcase}"\], \["table_name", "TEST_POSTS"\]\]/)
|
637
|
+
expect(@logger.logged(:debug).last).to match(/:table_name/)
|
638
|
+
expect(@logger.logged(:debug).last).to match(/\["table_name", "TEST_POSTS"\]/)
|
552
639
|
end
|
553
640
|
|
554
|
-
it "should return pk and sequence from pk_and_sequence_for
|
641
|
+
it "should return pk and sequence from pk_and_sequence_for with bind usage" do
|
555
642
|
expect(@conn.pk_and_sequence_for("TEST_POSTS").length).to eq 2
|
556
|
-
expect(@logger.logged(:debug).last).
|
557
|
-
expect(@logger.logged(:debug).last).not_to match(/\[\["owner", "#{DATABASE_USER.upcase}"\], \["table_name", "TEST_POSTS"\]\]/)
|
643
|
+
expect(@logger.logged(:debug).last).to match(/\["table_name", "TEST_POSTS"\]/)
|
558
644
|
end
|
559
645
|
|
560
646
|
it "should return pk from primary_keys with bind usage" do
|
561
647
|
expect(@conn.primary_keys("TEST_POSTS")).to eq ["id"]
|
562
|
-
expect(@logger.logged(:debug).last).to match(
|
563
|
-
|
648
|
+
expect(@logger.logged(:debug).last).to match(/\["table_name", "TEST_POSTS"\]/)
|
649
|
+
end
|
650
|
+
|
651
|
+
it "should not raise missing IN/OUT parameter like issue 1687 " do
|
652
|
+
# "to_sql" enforces unprepared_statement including dictionary access SQLs
|
653
|
+
expect { User.joins(:group).to_sql }.not_to raise_exception
|
564
654
|
end
|
565
655
|
|
566
656
|
it "should return false from temporary_table? with bind usage" do
|
567
657
|
expect(@conn.temporary_table?("TEST_POSTS")).to eq false
|
568
658
|
expect(@logger.logged(:debug).last).to match(/:table_name/)
|
569
|
-
expect(@logger.logged(:debug).last).to match(/\[
|
659
|
+
expect(@logger.logged(:debug).last).to match(/\["table_name", "TEST_POSTS"\]/)
|
570
660
|
end
|
571
|
-
|
572
661
|
end
|
573
662
|
|
574
663
|
describe "Transaction" do
|
@@ -580,7 +669,7 @@ describe "OracleEnhancedAdapter" do
|
|
580
669
|
end
|
581
670
|
class ::TestPost < ActiveRecord::Base
|
582
671
|
end
|
583
|
-
Thread.report_on_exception, @original_report_on_exception = false, Thread.report_on_exception
|
672
|
+
Thread.report_on_exception, @original_report_on_exception = false, Thread.report_on_exception
|
584
673
|
end
|
585
674
|
|
586
675
|
it "Raises Deadlocked when a deadlock is encountered" do
|
@@ -595,7 +684,7 @@ describe "OracleEnhancedAdapter" do
|
|
595
684
|
TestPost.transaction do
|
596
685
|
t1.lock!
|
597
686
|
barrier.wait
|
598
|
-
t2.
|
687
|
+
t2.update(title: "one")
|
599
688
|
end
|
600
689
|
end
|
601
690
|
|
@@ -603,7 +692,7 @@ describe "OracleEnhancedAdapter" do
|
|
603
692
|
TestPost.transaction do
|
604
693
|
t2.lock!
|
605
694
|
barrier.wait
|
606
|
-
t1.
|
695
|
+
t1.update(title: "two")
|
607
696
|
end
|
608
697
|
ensure
|
609
698
|
thread.join
|
@@ -617,7 +706,106 @@ describe "OracleEnhancedAdapter" do
|
|
617
706
|
end
|
618
707
|
Object.send(:remove_const, "TestPost") rescue nil
|
619
708
|
ActiveRecord::Base.clear_cache!
|
620
|
-
Thread.report_on_exception = @original_report_on_exception
|
709
|
+
Thread.report_on_exception = @original_report_on_exception
|
710
|
+
end
|
711
|
+
end
|
712
|
+
|
713
|
+
describe "Sequence" do
|
714
|
+
before(:all) do
|
715
|
+
ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
|
716
|
+
@conn = ActiveRecord::Base.connection
|
717
|
+
schema_define do
|
718
|
+
create_table :table_with_name_thats_just_ok,
|
719
|
+
sequence_name: "suitably_short_seq", force: true do |t|
|
720
|
+
t.column :foo, :string, null: false
|
721
|
+
end
|
722
|
+
end
|
723
|
+
end
|
724
|
+
after(:all) do
|
725
|
+
schema_define do
|
726
|
+
drop_table :table_with_name_thats_just_ok,
|
727
|
+
sequence_name: "suitably_short_seq" rescue nil
|
728
|
+
end
|
729
|
+
end
|
730
|
+
it "should create table with custom sequence name" do
|
731
|
+
expect(@conn.select_value("select suitably_short_seq.nextval from dual")).to eq(1)
|
732
|
+
end
|
733
|
+
end
|
734
|
+
|
735
|
+
describe "Hints" do
|
736
|
+
before(:all) do
|
737
|
+
ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
|
738
|
+
@conn = ActiveRecord::Base.connection
|
739
|
+
schema_define do
|
740
|
+
drop_table :test_posts, if_exists: true
|
741
|
+
create_table :test_posts
|
742
|
+
end
|
743
|
+
class ::TestPost < ActiveRecord::Base
|
744
|
+
end
|
745
|
+
end
|
746
|
+
|
747
|
+
before(:each) do
|
748
|
+
@conn.clear_cache!
|
749
|
+
set_logger
|
750
|
+
end
|
751
|
+
|
752
|
+
after(:each) do
|
753
|
+
clear_logger
|
754
|
+
end
|
755
|
+
|
756
|
+
after(:all) do
|
757
|
+
schema_define do
|
758
|
+
drop_table :test_posts
|
759
|
+
end
|
760
|
+
Object.send(:remove_const, "TestPost")
|
761
|
+
ActiveRecord::Base.clear_cache!
|
762
|
+
end
|
763
|
+
|
764
|
+
it "should explain considers hints" do
|
765
|
+
post = TestPost.optimizer_hints("FULL (\"TEST_POSTS\")")
|
766
|
+
post = post.where(id: 1)
|
767
|
+
expect(post.explain).to include("| TABLE ACCESS FULL| TEST_POSTS |")
|
768
|
+
end
|
769
|
+
|
770
|
+
it "should explain considers hints with /*+ */ " do
|
771
|
+
post = TestPost.optimizer_hints("/*+ FULL (\"TEST_POSTS\") */")
|
772
|
+
post = post.where(id: 1)
|
773
|
+
expect(post.explain).to include("| TABLE ACCESS FULL| TEST_POSTS |")
|
774
|
+
end
|
775
|
+
end
|
776
|
+
|
777
|
+
describe "homogeneous in" do
|
778
|
+
before(:all) do
|
779
|
+
ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
|
780
|
+
@conn = ActiveRecord::Base.connection
|
781
|
+
schema_define do
|
782
|
+
create_table :test_posts, force: true
|
783
|
+
create_table :test_comments, force: true do |t|
|
784
|
+
t.integer :test_post_id
|
785
|
+
end
|
786
|
+
end
|
787
|
+
class ::TestPost < ActiveRecord::Base
|
788
|
+
has_many :test_comments
|
789
|
+
end
|
790
|
+
class ::TestComment < ActiveRecord::Base
|
791
|
+
belongs_to :test_post
|
792
|
+
end
|
793
|
+
end
|
794
|
+
|
795
|
+
after(:all) do
|
796
|
+
schema_define do
|
797
|
+
drop_table :test_posts, if_exists: true
|
798
|
+
drop_table :test_comments, if_exists: true
|
799
|
+
end
|
800
|
+
Object.send(:remove_const, "TestPost")
|
801
|
+
Object.send(:remove_const, "TestComment")
|
802
|
+
ActiveRecord::Base.clear_cache!
|
803
|
+
end
|
804
|
+
|
805
|
+
it "should not raise undefined method length" do
|
806
|
+
post = TestPost.create!
|
807
|
+
post.test_comments << TestComment.create!
|
808
|
+
expect(TestComment.where(test_post_id: TestPost.select(:id)).size).to eq(1)
|
621
809
|
end
|
622
810
|
end
|
623
811
|
end
|
@@ -6,7 +6,7 @@ describe "OracleEnhancedAdapter date and datetime type detection based on attrib
|
|
6
6
|
@conn = ActiveRecord::Base.connection
|
7
7
|
@conn.execute "DROP TABLE test_employees" rescue nil
|
8
8
|
@conn.execute "DROP SEQUENCE test_employees_seq" rescue nil
|
9
|
-
@conn.execute
|
9
|
+
@conn.execute <<~SQL
|
10
10
|
CREATE TABLE test_employees (
|
11
11
|
employee_id NUMBER(6,0) PRIMARY KEY,
|
12
12
|
first_name VARCHAR2(20),
|
@@ -23,7 +23,7 @@ describe "OracleEnhancedAdapter date and datetime type detection based on attrib
|
|
23
23
|
updated_at DATE
|
24
24
|
)
|
25
25
|
SQL
|
26
|
-
@conn.execute
|
26
|
+
@conn.execute <<~SQL
|
27
27
|
CREATE SEQUENCE test_employees_seq MINVALUE 1
|
28
28
|
INCREMENT BY 1 START WITH 10040 CACHE 20 NOORDER NOCYCLE
|
29
29
|
SQL
|
@@ -122,7 +122,7 @@ describe "OracleEnhancedAdapter assign string to :date and :datetime columns" do
|
|
122
122
|
end
|
123
123
|
|
124
124
|
after(:each) do
|
125
|
-
ActiveRecord
|
125
|
+
ActiveRecord.default_timezone = :utc
|
126
126
|
end
|
127
127
|
|
128
128
|
it "should assign ISO string to date column" do
|
@@ -170,7 +170,7 @@ describe "OracleEnhancedAdapter assign string to :date and :datetime columns" do
|
|
170
170
|
end
|
171
171
|
|
172
172
|
it "should assign ISO time string to datetime column" do
|
173
|
-
ActiveRecord
|
173
|
+
ActiveRecord.default_timezone = :local
|
174
174
|
@employee = TestEmployee.create(
|
175
175
|
first_name: "First",
|
176
176
|
last_name: "Last",
|
@@ -182,7 +182,7 @@ describe "OracleEnhancedAdapter assign string to :date and :datetime columns" do
|
|
182
182
|
end
|
183
183
|
|
184
184
|
it "should assign NLS time string to datetime column" do
|
185
|
-
ActiveRecord
|
185
|
+
ActiveRecord.default_timezone = :local
|
186
186
|
@employee = TestEmployee.create(
|
187
187
|
first_name: "First",
|
188
188
|
last_name: "Last",
|
@@ -205,7 +205,7 @@ describe "OracleEnhancedAdapter assign string to :date and :datetime columns" do
|
|
205
205
|
end
|
206
206
|
|
207
207
|
it "should assign ISO date string to datetime column" do
|
208
|
-
ActiveRecord
|
208
|
+
ActiveRecord.default_timezone = :local
|
209
209
|
@employee = TestEmployee.create(
|
210
210
|
first_name: "First",
|
211
211
|
last_name: "Last",
|
@@ -217,7 +217,7 @@ describe "OracleEnhancedAdapter assign string to :date and :datetime columns" do
|
|
217
217
|
end
|
218
218
|
|
219
219
|
it "should assign NLS date string to datetime column" do
|
220
|
-
ActiveRecord
|
220
|
+
ActiveRecord.default_timezone = :local
|
221
221
|
@employee = TestEmployee.create(
|
222
222
|
first_name: "First",
|
223
223
|
last_name: "Last",
|
@@ -227,5 +227,4 @@ describe "OracleEnhancedAdapter assign string to :date and :datetime columns" do
|
|
227
227
|
@employee.reload
|
228
228
|
expect(@employee.last_login_at).to eq(@today.to_time)
|
229
229
|
end
|
230
|
-
|
231
230
|
end
|
@@ -4,7 +4,7 @@ describe "OracleEnhancedAdapter boolean type detection based on string column ty
|
|
4
4
|
before(:all) do
|
5
5
|
ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
|
6
6
|
@conn = ActiveRecord::Base.connection
|
7
|
-
@conn.execute
|
7
|
+
@conn.execute <<~SQL
|
8
8
|
CREATE TABLE test3_employees (
|
9
9
|
id NUMBER PRIMARY KEY,
|
10
10
|
first_name VARCHAR2(20),
|
@@ -25,7 +25,7 @@ describe "OracleEnhancedAdapter boolean type detection based on string column ty
|
|
25
25
|
test_boolean VARCHAR2(3)
|
26
26
|
)
|
27
27
|
SQL
|
28
|
-
@conn.execute
|
28
|
+
@conn.execute <<~SQL
|
29
29
|
CREATE SEQUENCE test3_employees_seq MINVALUE 1
|
30
30
|
INCREMENT BY 1 START WITH 10040 CACHE 20 NOORDER NOCYCLE
|
31
31
|
SQL
|
@@ -165,9 +165,7 @@ describe "OracleEnhancedAdapter boolean type detection based on string column ty
|
|
165
165
|
create_employee3
|
166
166
|
expect(@employee3.active_flag.class).to eq(String)
|
167
167
|
end
|
168
|
-
|
169
168
|
end
|
170
|
-
|
171
169
|
end
|
172
170
|
|
173
171
|
describe "OracleEnhancedAdapter boolean support when emulate_booleans_from_strings = true" do
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
describe "OracleEnhancedAdapter processing CHAR column" do
|
4
|
+
before(:all) do
|
5
|
+
ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
|
6
|
+
@conn = ActiveRecord::Base.connection
|
7
|
+
@conn.execute <<~SQL
|
8
|
+
CREATE TABLE test_items (
|
9
|
+
id NUMBER(6,0) PRIMARY KEY,
|
10
|
+
padded CHAR(10)
|
11
|
+
)
|
12
|
+
SQL
|
13
|
+
@conn.execute "CREATE SEQUENCE test_items_seq"
|
14
|
+
end
|
15
|
+
|
16
|
+
after(:all) do
|
17
|
+
@conn.execute "DROP TABLE test_items"
|
18
|
+
@conn.execute "DROP SEQUENCE test_items_seq"
|
19
|
+
end
|
20
|
+
|
21
|
+
before(:each) do
|
22
|
+
class ::TestItem < ActiveRecord::Base
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
after(:each) do
|
27
|
+
Object.send(:remove_const, "TestItem")
|
28
|
+
ActiveRecord::Base.clear_cache!
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should create and find record" do
|
32
|
+
str = "ABC"
|
33
|
+
TestItem.create!
|
34
|
+
item = TestItem.first
|
35
|
+
item.padded = str
|
36
|
+
item.save
|
37
|
+
|
38
|
+
expect(TestItem.where(padded: item.padded).count).to eq(1)
|
39
|
+
|
40
|
+
item_reloaded = TestItem.first
|
41
|
+
expect(item_reloaded.padded).to eq(str)
|
42
|
+
end
|
43
|
+
end
|