activerecord-oracle_enhanced-adapter 5.2.8 → 7.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +390 -21
  3. data/README.md +35 -8
  4. data/VERSION +1 -1
  5. data/lib/active_record/connection_adapters/emulation/oracle_adapter.rb +1 -1
  6. data/lib/active_record/connection_adapters/oracle_enhanced/column.rb +3 -3
  7. data/lib/active_record/connection_adapters/oracle_enhanced/connection.rb +42 -37
  8. data/lib/active_record/connection_adapters/oracle_enhanced/context_index.rb +59 -60
  9. data/lib/active_record/connection_adapters/oracle_enhanced/database_limits.rb +5 -10
  10. data/lib/active_record/connection_adapters/oracle_enhanced/database_statements.rb +86 -81
  11. data/lib/active_record/connection_adapters/oracle_enhanced/database_tasks.rb +9 -10
  12. data/lib/active_record/connection_adapters/oracle_enhanced/dbms_output.rb +1 -2
  13. data/lib/active_record/connection_adapters/oracle_enhanced/jdbc_connection.rb +37 -16
  14. data/lib/active_record/connection_adapters/oracle_enhanced/jdbc_quoting.rb +1 -1
  15. data/lib/active_record/connection_adapters/oracle_enhanced/lob.rb +5 -6
  16. data/lib/active_record/connection_adapters/oracle_enhanced/oci_connection.rb +58 -49
  17. data/lib/active_record/connection_adapters/oracle_enhanced/oci_quoting.rb +1 -1
  18. data/lib/active_record/connection_adapters/oracle_enhanced/procedures.rb +6 -7
  19. data/lib/active_record/connection_adapters/oracle_enhanced/quoting.rb +75 -51
  20. data/lib/active_record/connection_adapters/oracle_enhanced/schema_creation.rb +13 -14
  21. data/lib/active_record/connection_adapters/oracle_enhanced/schema_definitions.rb +14 -4
  22. data/lib/active_record/connection_adapters/oracle_enhanced/schema_dumper.rb +27 -24
  23. data/lib/active_record/connection_adapters/oracle_enhanced/schema_statements.rb +156 -155
  24. data/lib/active_record/connection_adapters/oracle_enhanced/structure_dump.rb +103 -90
  25. data/lib/active_record/connection_adapters/oracle_enhanced/type_metadata.rb +3 -2
  26. data/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb +261 -161
  27. data/lib/active_record/type/oracle_enhanced/boolean.rb +0 -1
  28. data/lib/active_record/type/oracle_enhanced/character_string.rb +36 -0
  29. data/lib/active_record/type/oracle_enhanced/integer.rb +0 -1
  30. data/lib/arel/visitors/oracle.rb +221 -0
  31. data/lib/arel/visitors/oracle12.rb +128 -0
  32. data/spec/active_record/connection_adapters/emulation/oracle_adapter_spec.rb +0 -2
  33. data/spec/active_record/connection_adapters/oracle_enhanced/connection_spec.rb +78 -26
  34. data/spec/active_record/connection_adapters/oracle_enhanced/context_index_spec.rb +7 -15
  35. data/spec/active_record/connection_adapters/oracle_enhanced/database_tasks_spec.rb +5 -0
  36. data/spec/active_record/connection_adapters/oracle_enhanced/dbms_output_spec.rb +17 -17
  37. data/spec/active_record/connection_adapters/oracle_enhanced/procedures_spec.rb +7 -10
  38. data/spec/active_record/connection_adapters/oracle_enhanced/quoting_spec.rb +0 -15
  39. data/spec/active_record/connection_adapters/oracle_enhanced/schema_dumper_spec.rb +33 -36
  40. data/spec/active_record/connection_adapters/oracle_enhanced/schema_statements_spec.rb +77 -258
  41. data/spec/active_record/connection_adapters/oracle_enhanced/structure_dump_spec.rb +38 -39
  42. data/spec/active_record/connection_adapters/oracle_enhanced_adapter_spec.rb +273 -85
  43. data/spec/active_record/connection_adapters/oracle_enhanced_data_types_spec.rb +7 -8
  44. data/spec/active_record/oracle_enhanced/type/boolean_spec.rb +2 -4
  45. data/spec/active_record/oracle_enhanced/type/character_string_spec.rb +43 -0
  46. data/spec/active_record/oracle_enhanced/type/custom_spec.rb +90 -0
  47. data/spec/active_record/oracle_enhanced/type/decimal_spec.rb +56 -0
  48. data/spec/active_record/oracle_enhanced/type/dirty_spec.rb +1 -1
  49. data/spec/active_record/oracle_enhanced/type/integer_spec.rb +2 -2
  50. data/spec/active_record/oracle_enhanced/type/json_spec.rb +0 -1
  51. data/spec/active_record/oracle_enhanced/type/national_character_string_spec.rb +6 -5
  52. data/spec/active_record/oracle_enhanced/type/timestamp_spec.rb +2 -4
  53. data/spec/spec_config.yaml.template +2 -2
  54. data/spec/spec_helper.rb +13 -2
  55. metadata +52 -30
  56. data/lib/active_record/connection_adapters/oracle_enhanced/schema_statements_ext.rb +0 -28
@@ -47,13 +47,13 @@ describe "OracleEnhancedAdapter structure dump" do
47
47
  end
48
48
 
49
49
  it "should dump composite primary keys" do
50
- pk = @conn.send(:select_one, <<-SQL)
50
+ pk = @conn.send(:select_one, <<~SQL)
51
51
  select constraint_name from user_constraints where table_name = 'TEST_POSTS' and constraint_type='P'
52
52
  SQL
53
- @conn.execute <<-SQL
53
+ @conn.execute <<~SQL
54
54
  alter table test_posts drop constraint #{pk["constraint_name"]}
55
55
  SQL
56
- @conn.execute <<-SQL
56
+ @conn.execute <<~SQL
57
57
  ALTER TABLE TEST_POSTS
58
58
  add CONSTRAINT pk_id_title PRIMARY KEY (id, title)
59
59
  SQL
@@ -62,33 +62,33 @@ describe "OracleEnhancedAdapter structure dump" do
62
62
  end
63
63
 
64
64
  it "should dump foreign keys" do
65
- @conn.execute <<-SQL
65
+ @conn.execute <<~SQL
66
66
  ALTER TABLE TEST_POSTS
67
67
  ADD CONSTRAINT fk_test_post_foo FOREIGN KEY (foo_id) REFERENCES foos(id)
68
68
  SQL
69
- dump = ActiveRecord::Base.connection.structure_dump_fk_constraints
69
+ dump = ActiveRecord::Base.connection.structure_dump
70
70
  expect(dump.split('\n').length).to eq(1)
71
- expect(dump).to match(/ALTER TABLE \"?TEST_POSTS\"? ADD CONSTRAINT \"?FK_TEST_POST_FOO\"? FOREIGN KEY \(\"?FOO_ID\"?\) REFERENCES \"?FOOS\"?\(\"?ID\"?\)/i)
71
+ expect(dump).to match(/ALTER TABLE "?TEST_POSTS"? ADD CONSTRAINT "?FK_TEST_POST_FOO"? FOREIGN KEY \("?FOO_ID"?\) REFERENCES "?FOOS"?\("?ID"?\)/i)
72
72
  end
73
73
 
74
74
  it "should dump foreign keys when reference column name is not 'id'" do
75
75
  @conn.add_column :foos, :baz_id, :integer
76
76
 
77
- @conn.execute <<-SQL
77
+ @conn.execute <<~SQL
78
78
  ALTER TABLE FOOS
79
79
  ADD CONSTRAINT UK_BAZ UNIQUE (BAZ_ID)
80
80
  SQL
81
81
 
82
82
  @conn.add_column :test_posts, :baz_id, :integer
83
83
 
84
- @conn.execute <<-SQL
84
+ @conn.execute <<~SQL
85
85
  ALTER TABLE TEST_POSTS
86
86
  ADD CONSTRAINT fk_test_post_baz FOREIGN KEY (baz_id) REFERENCES foos(baz_id)
87
87
  SQL
88
88
 
89
- dump = ActiveRecord::Base.connection.structure_dump_fk_constraints
89
+ dump = ActiveRecord::Base.connection.structure_dump
90
90
  expect(dump.split('\n').length).to eq(1)
91
- expect(dump).to match(/ALTER TABLE \"?TEST_POSTS\"? ADD CONSTRAINT \"?FK_TEST_POST_BAZ\"? FOREIGN KEY \(\"?BAZ_ID\"?\) REFERENCES \"?FOOS\"?\(\"?BAZ_ID\"?\)/i)
91
+ expect(dump).to match(/ALTER TABLE "?TEST_POSTS"? ADD CONSTRAINT "?FK_TEST_POST_BAZ"? FOREIGN KEY \("?BAZ_ID"?\) REFERENCES "?FOOS"?\("?BAZ_ID"?\)/i)
92
92
  end
93
93
 
94
94
  it "should not error when no foreign keys are present" do
@@ -98,7 +98,7 @@ describe "OracleEnhancedAdapter structure dump" do
98
98
  end
99
99
 
100
100
  it "should dump triggers" do
101
- @conn.execute <<-SQL
101
+ @conn.execute <<~SQL
102
102
  create or replace TRIGGER TEST_POST_TRIGGER
103
103
  BEFORE INSERT
104
104
  ON TEST_POSTS
@@ -112,7 +112,7 @@ describe "OracleEnhancedAdapter structure dump" do
112
112
  end
113
113
 
114
114
  it "should dump types" do
115
- @conn.execute <<-SQL
115
+ @conn.execute <<~SQL
116
116
  create or replace TYPE TEST_TYPE AS TABLE OF VARCHAR2(10);
117
117
  SQL
118
118
  dump = ActiveRecord::Base.connection.structure_dump_db_stored_code.gsub(/\n|\s+/, " ")
@@ -122,13 +122,13 @@ describe "OracleEnhancedAdapter structure dump" do
122
122
  it "should dump views" do
123
123
  @conn.execute "create or replace VIEW test_posts_view_z as select * from test_posts"
124
124
  @conn.execute "create or replace VIEW test_posts_view_a as select * from test_posts_view_z"
125
- dump = ActiveRecord::Base.connection.structure_dump_db_stored_code.gsub(/\n|\s+/, " ")
125
+ dump = ActiveRecord::Base.connection.structure_dump.gsub(/\n|\s+/, " ")
126
126
  expect(dump).to match(/CREATE OR REPLACE FORCE VIEW TEST_POSTS_VIEW_A.*CREATE OR REPLACE FORCE VIEW TEST_POSTS_VIEW_Z/)
127
127
  end
128
128
 
129
129
  it "should dump virtual columns" do
130
130
  skip "Not supported in this database version" unless @oracle11g_or_higher
131
- @conn.execute <<-SQL
131
+ @conn.execute <<~SQL
132
132
  CREATE TABLE bars (
133
133
  id NUMBER(38,0) NOT NULL,
134
134
  id_plus NUMBER GENERATED ALWAYS AS(id + 2) VIRTUAL,
@@ -136,12 +136,12 @@ describe "OracleEnhancedAdapter structure dump" do
136
136
  )
137
137
  SQL
138
138
  dump = ActiveRecord::Base.connection.structure_dump
139
- expect(dump).to match(/\"?ID_PLUS\"? NUMBER GENERATED ALWAYS AS \(ID\+2\) VIRTUAL/)
139
+ expect(dump).to match(/"?ID_PLUS"? NUMBER GENERATED ALWAYS AS \(ID\+2\) VIRTUAL/)
140
140
  end
141
141
 
142
142
  it "should dump RAW virtual columns" do
143
143
  skip "Not supported in this database version" unless @oracle11g_or_higher
144
- @conn.execute <<-SQL
144
+ @conn.execute <<~SQL
145
145
  CREATE TABLE bars (
146
146
  id NUMBER(38,0) NOT NULL,
147
147
  super RAW(255) GENERATED ALWAYS AS \( HEXTORAW\(ID\) \) VIRTUAL,
@@ -149,11 +149,11 @@ describe "OracleEnhancedAdapter structure dump" do
149
149
  )
150
150
  SQL
151
151
  dump = ActiveRecord::Base.connection.structure_dump
152
- expect(dump).to match(/CREATE TABLE \"BARS\" \(\n \"ID\" NUMBER\(38,0\) NOT NULL,\n \"SUPER\" RAW\(255\) GENERATED ALWAYS AS \(HEXTORAW\(TO_CHAR\(ID\)\)\) VIRTUAL/)
152
+ expect(dump).to match(/CREATE TABLE "BARS" \(\n "ID" NUMBER\(38,0\) NOT NULL,\n "SUPER" RAW\(255\) GENERATED ALWAYS AS \(HEXTORAW\(TO_CHAR\(ID\)\)\) VIRTUAL/)
153
153
  end
154
154
 
155
155
  it "should dump NCLOB columns" do
156
- @conn.execute <<-SQL
156
+ @conn.execute <<~SQL
157
157
  CREATE TABLE bars (
158
158
  id NUMBER(38,0) NOT NULL,
159
159
  nclob_text NCLOB,
@@ -161,11 +161,11 @@ describe "OracleEnhancedAdapter structure dump" do
161
161
  )
162
162
  SQL
163
163
  dump = ActiveRecord::Base.connection.structure_dump
164
- expect(dump).to match(/CREATE TABLE \"BARS\" \(\n \"ID\" NUMBER\(38,0\) NOT NULL,\n \"NCLOB_TEXT\" NCLOB/)
164
+ expect(dump).to match(/CREATE TABLE "BARS" \(\n "ID" NUMBER\(38,0\) NOT NULL,\n "NCLOB_TEXT" NCLOB/)
165
165
  end
166
166
 
167
167
  it "should dump unique keys" do
168
- @conn.execute <<-SQL
168
+ @conn.execute <<~SQL
169
169
  ALTER TABLE test_posts
170
170
  add CONSTRAINT uk_foo_foo_id UNIQUE (foo, foo_id)
171
171
  SQL
@@ -180,31 +180,31 @@ describe "OracleEnhancedAdapter structure dump" do
180
180
  ActiveRecord::Base.connection.add_index(:test_posts, :foo, name: :ix_test_posts_foo)
181
181
  ActiveRecord::Base.connection.add_index(:test_posts, :foo_id, name: :ix_test_posts_foo_id, unique: true)
182
182
 
183
- @conn.execute <<-SQL
183
+ @conn.execute <<~SQL
184
184
  ALTER TABLE test_posts
185
185
  add CONSTRAINT uk_foo_foo_id UNIQUE (foo, foo_id)
186
186
  SQL
187
187
 
188
188
  dump = ActiveRecord::Base.connection.structure_dump
189
189
  expect(dump).to match(/CREATE UNIQUE INDEX "?IX_TEST_POSTS_FOO_ID"? ON "?TEST_POSTS"? \("?FOO_ID"?\)/i)
190
- expect(dump).to match(/CREATE INDEX "?IX_TEST_POSTS_FOO\"? ON "?TEST_POSTS"? \("?FOO"?\)/i)
190
+ expect(dump).to match(/CREATE INDEX "?IX_TEST_POSTS_FOO"? ON "?TEST_POSTS"? \("?FOO"?\)/i)
191
191
  expect(dump).not_to match(/CREATE UNIQUE INDEX "?UK_TEST_POSTS_/i)
192
192
  end
193
193
 
194
194
  it "should dump multi-value and function value indexes" do
195
195
  ActiveRecord::Base.connection.add_index(:test_posts, [:foo, :foo_id], name: :ix_test_posts_foo_foo_id)
196
196
 
197
- @conn.execute <<-SQL
197
+ @conn.execute <<~SQL
198
198
  CREATE INDEX "IX_TEST_POSTS_FUNCTION" ON "TEST_POSTS" (TO_CHAR(LENGTH("FOO"))||"FOO")
199
199
  SQL
200
200
 
201
201
  dump = ActiveRecord::Base.connection.structure_dump
202
- expect(dump).to match(/CREATE INDEX "?IX_TEST_POSTS_FOO_FOO_ID\"? ON "?TEST_POSTS"? \("?FOO"?, "?FOO_ID"?\)/i)
203
- expect(dump).to match(/CREATE INDEX "?IX_TEST_POSTS_FUNCTION\"? ON "?TEST_POSTS"? \(TO_CHAR\(LENGTH\("?FOO"?\)\)\|\|"?FOO"?\)/i)
202
+ expect(dump).to match(/CREATE INDEX "?IX_TEST_POSTS_FOO_FOO_ID"? ON "?TEST_POSTS"? \("?FOO"?, "?FOO_ID"?\)/i)
203
+ expect(dump).to match(/CREATE INDEX "?IX_TEST_POSTS_FUNCTION"? ON "?TEST_POSTS"? \(TO_CHAR\(LENGTH\("?FOO"?\)\)\|\|"?FOO"?\)/i)
204
204
  end
205
205
 
206
206
  it "should dump RAW columns" do
207
- @conn.execute <<-SQL
207
+ @conn.execute <<~SQL
208
208
  CREATE TABLE bars (
209
209
  id NUMBER(38,0) NOT NULL,
210
210
  super RAW(255),
@@ -212,7 +212,7 @@ describe "OracleEnhancedAdapter structure dump" do
212
212
  )
213
213
  SQL
214
214
  dump = ActiveRecord::Base.connection.structure_dump
215
- expect(dump).to match(/CREATE TABLE \"BARS\" \(\n \"ID\" NUMBER\(38,0\) NOT NULL,\n \"SUPER\" RAW\(255\)/)
215
+ expect(dump).to match(/CREATE TABLE "BARS" \(\n "ID" NUMBER\(38,0\) NOT NULL,\n "SUPER" RAW\(255\)/)
216
216
  end
217
217
 
218
218
  it "should dump table comments" do
@@ -242,7 +242,6 @@ describe "OracleEnhancedAdapter structure dump" do
242
242
  dump = ActiveRecord::Base.connection.structure_dump
243
243
  expect(dump).to match(/#{comment_sql}/)
244
244
  end
245
-
246
245
  end
247
246
  describe "temporary tables" do
248
247
  after(:all) do
@@ -270,7 +269,7 @@ describe "OracleEnhancedAdapter structure dump" do
270
269
  end
271
270
  context "default sequence" do
272
271
  let(:sql) { "CREATE SEQUENCE \"#{sequence_name}\"" }
273
- it { is_expected.to_not match(%r{CREATE SEQUENCE \"#{sequence_name}" MAXVALUE \d+ MINVALUE \d+ NOORDER NOCYCLE}) }
272
+ it { is_expected.to_not match(%r{CREATE SEQUENCE "#{sequence_name}" MAXVALUE \d+ MINVALUE \d+ NOORDER NOCYCLE}) }
274
273
  end
275
274
  context "noorder" do
276
275
  let(:sql) { "CREATE SEQUENCE \"#{sequence_name}\" NOORDER" }
@@ -291,7 +290,7 @@ describe "OracleEnhancedAdapter structure dump" do
291
290
 
292
291
  describe "database structure dump extensions" do
293
292
  before(:all) do
294
- @conn.execute <<-SQL
293
+ @conn.execute <<~SQL
295
294
  CREATE TABLE nvarchartable (
296
295
  unq_nvarchar NVARCHAR2(255) DEFAULT NULL
297
296
  )
@@ -350,7 +349,7 @@ describe "OracleEnhancedAdapter structure dump" do
350
349
  it "should dump schema migrations using multi inserts" do
351
350
  skip "Not supported in this database version" unless ActiveRecord::Base.connection.supports_multi_insert?
352
351
 
353
- expect(dump).to eq <<-SQL.strip_heredoc
352
+ expect(dump).to eq <<~SQL
354
353
  INSERT ALL
355
354
  INTO "SCHEMA_MIGRATIONS" (version) VALUES ('20160101000000')
356
355
  INTO "SCHEMA_MIGRATIONS" (version) VALUES ('20160102000000')
@@ -395,20 +394,20 @@ describe "OracleEnhancedAdapter structure dump" do
395
394
  t.string :foo
396
395
  end
397
396
  # view
398
- @conn.execute <<-SQL
397
+ @conn.execute <<~SQL
399
398
  create or replace view full_drop_test_view (foo) as select id as "foo" from full_drop_test
400
399
  SQL
401
400
  # materialized view
402
- @conn.execute <<-SQL
401
+ @conn.execute <<~SQL
403
402
  create materialized view full_drop_test_mview (foo) as select id as "foo" from full_drop_test
404
403
  SQL
405
404
  # package
406
- @conn.execute <<-SQL
405
+ @conn.execute <<~SQL
407
406
  create or replace package full_drop_test_package as
408
407
  function test_func return varchar2;
409
408
  end test_package;
410
409
  SQL
411
- @conn.execute <<-SQL
410
+ @conn.execute <<~SQL
412
411
  create or replace package body full_drop_test_package as
413
412
  function test_func return varchar2 is
414
413
  begin
@@ -417,7 +416,7 @@ describe "OracleEnhancedAdapter structure dump" do
417
416
  end test_package;
418
417
  SQL
419
418
  # function
420
- @conn.execute <<-SQL
419
+ @conn.execute <<~SQL
421
420
  create or replace function full_drop_test_function
422
421
  return varchar2
423
422
  is
@@ -427,7 +426,7 @@ describe "OracleEnhancedAdapter structure dump" do
427
426
  end;
428
427
  SQL
429
428
  # procedure
430
- @conn.execute <<-SQL
429
+ @conn.execute <<~SQL
431
430
  create or replace procedure full_drop_test_procedure
432
431
  begin
433
432
  delete from full_drop_test where id=1231231231
@@ -437,11 +436,11 @@ describe "OracleEnhancedAdapter structure dump" do
437
436
  end;
438
437
  SQL
439
438
  # synonym
440
- @conn.execute <<-SQL
439
+ @conn.execute <<~SQL
441
440
  create or replace synonym full_drop_test_synonym for full_drop_test
442
441
  SQL
443
442
  # type
444
- @conn.execute <<-SQL
443
+ @conn.execute <<~SQL
445
444
  create or replace type full_drop_test_type as table of number
446
445
  SQL
447
446
  end