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.
- 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
@@ -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,
|
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
|
53
|
+
@conn.execute <<~SQL
|
54
54
|
alter table test_posts drop constraint #{pk["constraint_name"]}
|
55
55
|
SQL
|
56
|
-
@conn.execute
|
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
|
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.
|
69
|
+
dump = ActiveRecord::Base.connection.structure_dump
|
70
70
|
expect(dump.split('\n').length).to eq(1)
|
71
|
-
expect(dump).to match(/ALTER TABLE
|
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
|
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
|
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.
|
89
|
+
dump = ActiveRecord::Base.connection.structure_dump
|
90
90
|
expect(dump.split('\n').length).to eq(1)
|
91
|
-
expect(dump).to match(/ALTER TABLE
|
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
|
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
|
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.
|
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
|
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(
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
203
|
-
expect(dump).to match(/CREATE INDEX "?IX_TEST_POSTS_FUNCTION
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
443
|
+
@conn.execute <<~SQL
|
445
444
|
create or replace type full_drop_test_type as table of number
|
446
445
|
SQL
|
447
446
|
end
|