activerecord-oracle_enhanced-adapter 6.0.4 → 6.0.5
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 +7 -0
- data/VERSION +1 -1
- data/lib/active_record/connection_adapters/oracle_enhanced/connection.rb +1 -1
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_dumper.rb +1 -1
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_statements.rb +17 -14
- data/lib/active_record/connection_adapters/oracle_enhanced/structure_dump.rb +19 -17
- data/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb +31 -7
- data/spec/active_record/connection_adapters/oracle_enhanced_adapter_spec.rb +39 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5c17fca6feaefdeefe04446c769a721e5f26b6f2ed254bef6f3bdee85a66b222
|
4
|
+
data.tar.gz: 5d975d115515ccbacb1b540dc8ece885f218213128d462536df3023b0112bbe2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a736592361bc80d4930bbd0a2b21680dd1458400c66832c401f164c1effe9179e5a0771c5877b70df6286ef05ec81f71d8f1a96b1479c43f1b3f9d2b7d46c55e
|
7
|
+
data.tar.gz: 158dd74c1af746d0295b593ad62bedaa656374740151b4fb99342d9f33eedef8ed85f42b3e9622ab9289938f1b62c8e37a4eeca87f39a2779a42081e65d09bb4
|
data/History.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
## 6.0.5 / 2020-12-17
|
2
|
+
|
3
|
+
* Changes and bug fixes
|
4
|
+
* Address `next_sequence_value` ArgumentError syntax [#2048 #2050]
|
5
|
+
* Add /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ hint to address slow SCHEMA queries [#2055, #2069]
|
6
|
+
* `build_subselect` does not have ordering [#2023, #2070, #2073]
|
7
|
+
|
1
8
|
## 6.0.4 / 2020-08-18
|
2
9
|
|
3
10
|
* Changes and bug fixes
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
6.0.
|
1
|
+
6.0.5
|
@@ -35,7 +35,7 @@ module ActiveRecord
|
|
35
35
|
table_owner, table_name = default_owner, real_name
|
36
36
|
end
|
37
37
|
sql = <<~SQL.squish
|
38
|
-
SELECT owner, table_name, 'TABLE' name_type
|
38
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ owner, table_name, 'TABLE' name_type
|
39
39
|
FROM all_tables
|
40
40
|
WHERE owner = '#{table_owner}'
|
41
41
|
AND table_name = '#{table_name}'
|
@@ -169,7 +169,7 @@ module ActiveRecord #:nodoc:
|
|
169
169
|
def extract_expression_for_virtual_column(column)
|
170
170
|
column_name = column.name
|
171
171
|
@connection.select_value(<<~SQL.squish, "Table comment", [bind_string("table_name", table_name.upcase), bind_string("column_name", column_name.upcase)]).inspect
|
172
|
-
select data_default from all_tab_columns
|
172
|
+
select /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ data_default from all_tab_columns
|
173
173
|
where owner = SYS_CONTEXT('userenv', 'current_schema')
|
174
174
|
and table_name = :table_name
|
175
175
|
and column_name = :column_name
|
@@ -12,7 +12,8 @@ module ActiveRecord
|
|
12
12
|
|
13
13
|
def tables #:nodoc:
|
14
14
|
select_values(<<~SQL.squish, "tables")
|
15
|
-
SELECT
|
15
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */
|
16
|
+
DECODE(table_name, UPPER(table_name), LOWER(table_name), table_name)
|
16
17
|
FROM all_tables
|
17
18
|
WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
|
18
19
|
AND secondary = 'N'
|
@@ -44,7 +45,7 @@ module ActiveRecord
|
|
44
45
|
end
|
45
46
|
|
46
47
|
select_values(<<~SQL.squish, "table exists", [bind_string("owner", table_owner), bind_string("table_name", table_name)]).any?
|
47
|
-
SELECT owner, table_name
|
48
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ owner, table_name
|
48
49
|
FROM all_tables
|
49
50
|
WHERE owner = :owner
|
50
51
|
AND table_name = :table_name
|
@@ -60,20 +61,22 @@ module ActiveRecord
|
|
60
61
|
|
61
62
|
def views # :nodoc:
|
62
63
|
select_values(<<~SQL.squish, "views")
|
63
|
-
SELECT
|
64
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */
|
65
|
+
LOWER(view_name) FROM all_views WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
|
64
66
|
SQL
|
65
67
|
end
|
66
68
|
|
67
69
|
def materialized_views #:nodoc:
|
68
70
|
select_values(<<~SQL.squish, "materialized views")
|
69
|
-
SELECT
|
71
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */
|
72
|
+
LOWER(mview_name) FROM all_mviews WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
|
70
73
|
SQL
|
71
74
|
end
|
72
75
|
|
73
76
|
# get synonyms for schema dump
|
74
77
|
def synonyms
|
75
78
|
result = select_all(<<~SQL.squish, "synonyms")
|
76
|
-
SELECT synonym_name, table_owner, table_name
|
79
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ synonym_name, table_owner, table_name
|
77
80
|
FROM all_synonyms where owner = SYS_CONTEXT('userenv', 'current_schema')
|
78
81
|
SQL
|
79
82
|
|
@@ -88,7 +91,7 @@ module ActiveRecord
|
|
88
91
|
default_tablespace_name = default_tablespace
|
89
92
|
|
90
93
|
result = select_all(<<~SQL.squish, "indexes", [bind_string("table_name", table_name)])
|
91
|
-
SELECT LOWER(i.table_name) AS table_name, LOWER(i.index_name) AS index_name, i.uniqueness,
|
94
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ LOWER(i.table_name) AS table_name, LOWER(i.index_name) AS index_name, i.uniqueness,
|
92
95
|
i.index_type, i.ityp_owner, i.ityp_name, i.parameters,
|
93
96
|
LOWER(i.tablespace_name) AS tablespace_name,
|
94
97
|
LOWER(c.column_name) AS column_name, e.column_expression,
|
@@ -118,7 +121,7 @@ module ActiveRecord
|
|
118
121
|
if row["index_type"] == "DOMAIN" && row["ityp_owner"] == "CTXSYS" && row["ityp_name"] == "CONTEXT"
|
119
122
|
procedure_name = default_datastore_procedure(row["index_name"])
|
120
123
|
source = select_values(<<~SQL.squish, "procedure", [bind_string("procedure_name", procedure_name.upcase)]).join
|
121
|
-
SELECT text
|
124
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ text
|
122
125
|
FROM all_source
|
123
126
|
WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
|
124
127
|
AND name = :procedure_name
|
@@ -362,7 +365,7 @@ module ActiveRecord
|
|
362
365
|
def index_name_exists?(table_name, index_name)
|
363
366
|
(_owner, table_name) = @connection.describe(table_name)
|
364
367
|
result = select_value(<<~SQL.squish, "index name exists")
|
365
|
-
SELECT 1 FROM all_indexes i
|
368
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ 1 FROM all_indexes i
|
366
369
|
WHERE i.owner = SYS_CONTEXT('userenv', 'current_schema')
|
367
370
|
AND i.table_owner = SYS_CONTEXT('userenv', 'current_schema')
|
368
371
|
AND i.table_name = '#{table_name}'
|
@@ -496,7 +499,7 @@ module ActiveRecord
|
|
496
499
|
def table_comment(table_name) #:nodoc:
|
497
500
|
(_owner, table_name) = @connection.describe(table_name)
|
498
501
|
select_value(<<~SQL.squish, "Table comment", [bind_string("table_name", table_name)])
|
499
|
-
SELECT comments FROM all_tab_comments
|
502
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ comments FROM all_tab_comments
|
500
503
|
WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
|
501
504
|
AND table_name = :table_name
|
502
505
|
SQL
|
@@ -512,7 +515,7 @@ module ActiveRecord
|
|
512
515
|
# TODO: it does not exist in Abstract adapter
|
513
516
|
(_owner, table_name) = @connection.describe(table_name)
|
514
517
|
select_value(<<~SQL.squish, "Column comment", [bind_string("table_name", table_name), bind_string("column_name", column_name.upcase)])
|
515
|
-
SELECT comments FROM all_col_comments
|
518
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ comments FROM all_col_comments
|
516
519
|
WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
|
517
520
|
AND table_name = :table_name
|
518
521
|
AND column_name = :column_name
|
@@ -529,7 +532,7 @@ module ActiveRecord
|
|
529
532
|
|
530
533
|
def tablespace(table_name)
|
531
534
|
select_value(<<~SQL.squish, "tablespace")
|
532
|
-
SELECT tablespace_name
|
535
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ tablespace_name
|
533
536
|
FROM all_tables
|
534
537
|
WHERE table_name='#{table_name.to_s.upcase}'
|
535
538
|
AND owner = SYS_CONTEXT('userenv', 'current_schema')
|
@@ -541,7 +544,7 @@ module ActiveRecord
|
|
541
544
|
(_owner, desc_table_name) = @connection.describe(table_name)
|
542
545
|
|
543
546
|
fk_info = select_all(<<~SQL.squish, "Foreign Keys", [bind_string("desc_table_name", desc_table_name)])
|
544
|
-
SELECT r.table_name to_table
|
547
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ r.table_name to_table
|
545
548
|
,rc.column_name references_column
|
546
549
|
,cc.column_name
|
547
550
|
,c.constraint_name name
|
@@ -583,7 +586,7 @@ module ActiveRecord
|
|
583
586
|
|
584
587
|
def disable_referential_integrity(&block) #:nodoc:
|
585
588
|
old_constraints = select_all(<<~SQL.squish, "Foreign Keys to disable and enable")
|
586
|
-
SELECT constraint_name, owner, table_name
|
589
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ constraint_name, owner, table_name
|
587
590
|
FROM all_constraints
|
588
591
|
WHERE constraint_type = 'R'
|
589
592
|
AND status = 'ENABLED'
|
@@ -699,7 +702,7 @@ module ActiveRecord
|
|
699
702
|
return unless tablespace
|
700
703
|
|
701
704
|
index_name = select_value(<<~SQL.squish, "Index name for primary key", [bind_string("table_name", table_name.upcase)])
|
702
|
-
SELECT index_name FROM all_constraints
|
705
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ index_name FROM all_constraints
|
703
706
|
WHERE table_name = :table_name
|
704
707
|
AND constraint_type = 'P'
|
705
708
|
AND owner = SYS_CONTEXT('userenv', 'current_schema')
|
@@ -9,7 +9,8 @@ module ActiveRecord #:nodoc:
|
|
9
9
|
|
10
10
|
def structure_dump #:nodoc:
|
11
11
|
sequences = select(<<~SQL.squish, "sequences to dump at structure dump")
|
12
|
-
SELECT
|
12
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */
|
13
|
+
sequence_name, min_value, max_value, increment_by, order_flag, cycle_flag
|
13
14
|
FROM all_sequences
|
14
15
|
where sequence_owner = SYS_CONTEXT('userenv', 'current_schema') ORDER BY 1
|
15
16
|
SQL
|
@@ -18,7 +19,7 @@ module ActiveRecord #:nodoc:
|
|
18
19
|
"CREATE SEQUENCE #{quote_table_name(result["sequence_name"])} MINVALUE #{result["min_value"]} MAXVALUE #{result["max_value"]} INCREMENT BY #{result["increment_by"]} #{result["order_flag"] == 'Y' ? "ORDER" : "NOORDER"} #{result["cycle_flag"] == 'Y' ? "CYCLE" : "NOCYCLE"}"
|
19
20
|
end
|
20
21
|
tables = select_values(<<~SQL.squish, "tables at structure dump")
|
21
|
-
SELECT table_name FROM all_tables t
|
22
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ table_name FROM all_tables t
|
22
23
|
WHERE owner = SYS_CONTEXT('userenv', 'current_schema') AND secondary = 'N'
|
23
24
|
AND NOT EXISTS (SELECT mv.mview_name FROM all_mviews mv
|
24
25
|
WHERE mv.owner = t.owner AND mv.mview_name = t.table_name)
|
@@ -30,7 +31,7 @@ module ActiveRecord #:nodoc:
|
|
30
31
|
virtual_columns = virtual_columns_for(table_name) if supports_virtual_columns?
|
31
32
|
ddl = +"CREATE#{ ' GLOBAL TEMPORARY' if temporary_table?(table_name)} TABLE \"#{table_name}\" (\n"
|
32
33
|
columns = select_all(<<~SQL.squish, "columns at structure dump")
|
33
|
-
SELECT column_name, data_type, data_length, char_used, char_length,
|
34
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ column_name, data_type, data_length, char_used, char_length,
|
34
35
|
data_precision, data_scale, data_default, nullable
|
35
36
|
FROM all_tab_columns
|
36
37
|
WHERE table_name = '#{table_name}'
|
@@ -90,7 +91,7 @@ module ActiveRecord #:nodoc:
|
|
90
91
|
def structure_dump_primary_key(table) #:nodoc:
|
91
92
|
opts = { name: "", cols: [] }
|
92
93
|
pks = select_all(<<~SQL.squish, "Primary Keys")
|
93
|
-
SELECT a.constraint_name, a.column_name, a.position
|
94
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ a.constraint_name, a.column_name, a.position
|
94
95
|
FROM all_cons_columns a
|
95
96
|
JOIN all_constraints c
|
96
97
|
ON a.constraint_name = c.constraint_name
|
@@ -109,7 +110,7 @@ module ActiveRecord #:nodoc:
|
|
109
110
|
def structure_dump_unique_keys(table) #:nodoc:
|
110
111
|
keys = {}
|
111
112
|
uks = select_all(<<~SQL.squish, "Primary Keys")
|
112
|
-
SELECT a.constraint_name, a.column_name, a.position
|
113
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ a.constraint_name, a.column_name, a.position
|
113
114
|
FROM all_cons_columns a
|
114
115
|
JOIN all_constraints c
|
115
116
|
ON a.constraint_name = c.constraint_name
|
@@ -145,7 +146,7 @@ module ActiveRecord #:nodoc:
|
|
145
146
|
|
146
147
|
def structure_dump_fk_constraints #:nodoc:
|
147
148
|
foreign_keys = select_all(<<~SQL.squish, "foreign keys at structure dump")
|
148
|
-
SELECT table_name FROM all_tables
|
149
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ table_name FROM all_tables
|
149
150
|
WHERE owner = SYS_CONTEXT('userenv', 'current_schema') ORDER BY 1
|
150
151
|
SQL
|
151
152
|
fks = foreign_keys.map do |table|
|
@@ -173,7 +174,7 @@ module ActiveRecord #:nodoc:
|
|
173
174
|
def structure_dump_column_comments(table_name)
|
174
175
|
comments = []
|
175
176
|
columns = select_values(<<~SQL.squish, "column comments at structure dump")
|
176
|
-
SELECT column_name FROM user_tab_columns
|
177
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ column_name FROM user_tab_columns
|
177
178
|
WHERE table_name = '#{table_name}' ORDER BY column_id
|
178
179
|
SQL
|
179
180
|
|
@@ -207,7 +208,7 @@ module ActiveRecord #:nodoc:
|
|
207
208
|
def structure_dump_db_stored_code #:nodoc:
|
208
209
|
structure = []
|
209
210
|
all_source = select_all(<<~SQL.squish, "stored program at structure dump")
|
210
|
-
SELECT DISTINCT name, type
|
211
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ DISTINCT name, type
|
211
212
|
FROM all_source
|
212
213
|
WHERE type IN ('PROCEDURE', 'PACKAGE', 'PACKAGE BODY', 'FUNCTION', 'TRIGGER', 'TYPE')
|
213
214
|
AND name NOT LIKE 'BIN$%'
|
@@ -216,7 +217,7 @@ module ActiveRecord #:nodoc:
|
|
216
217
|
all_source.each do |source|
|
217
218
|
ddl = +"CREATE OR REPLACE \n"
|
218
219
|
texts = select_all(<<~SQL.squish, "all source at structure dump")
|
219
|
-
SELECT text
|
220
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ text
|
220
221
|
FROM all_source
|
221
222
|
WHERE name = '#{source['name']}'
|
222
223
|
AND type = '#{source['type']}'
|
@@ -239,7 +240,7 @@ module ActiveRecord #:nodoc:
|
|
239
240
|
def structure_dump_views #:nodoc:
|
240
241
|
structure = []
|
241
242
|
views = select_all(<<~SQL.squish, "views at structure dump")
|
242
|
-
SELECT view_name, text FROM all_views
|
243
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ view_name, text FROM all_views
|
243
244
|
WHERE owner = SYS_CONTEXT('userenv', 'current_schema') ORDER BY view_name ASC
|
244
245
|
SQL
|
245
246
|
views.each do |view|
|
@@ -251,7 +252,7 @@ module ActiveRecord #:nodoc:
|
|
251
252
|
def structure_dump_synonyms #:nodoc:
|
252
253
|
structure = []
|
253
254
|
synonyms = select_all(<<~SQL.squish, "synonyms at structure dump")
|
254
|
-
SELECT owner, synonym_name, table_name, table_owner
|
255
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ owner, synonym_name, table_name, table_owner
|
255
256
|
FROM all_synonyms
|
256
257
|
WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
|
257
258
|
SQL
|
@@ -264,13 +265,14 @@ module ActiveRecord #:nodoc:
|
|
264
265
|
|
265
266
|
def structure_drop #:nodoc:
|
266
267
|
sequences = select_values(<<~SQL.squish, "sequences to drop at structure dump")
|
267
|
-
SELECT
|
268
|
+
SELECT/*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */
|
269
|
+
sequence_name FROM all_sequences where sequence_owner = SYS_CONTEXT('userenv', 'current_schema') ORDER BY 1
|
268
270
|
SQL
|
269
271
|
statements = sequences.map do |seq|
|
270
272
|
"DROP SEQUENCE \"#{seq}\""
|
271
273
|
end
|
272
274
|
tables = select_values(<<~SQL.squish, "tables to drop at structure dump")
|
273
|
-
SELECT table_name from all_tables t
|
275
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ table_name from all_tables t
|
274
276
|
WHERE owner = SYS_CONTEXT('userenv', 'current_schema') AND secondary = 'N'
|
275
277
|
AND NOT EXISTS (SELECT mv.mview_name FROM all_mviews mv
|
276
278
|
WHERE mv.owner = t.owner AND mv.mview_name = t.table_name)
|
@@ -286,7 +288,7 @@ module ActiveRecord #:nodoc:
|
|
286
288
|
|
287
289
|
def temp_table_drop #:nodoc:
|
288
290
|
temporary_tables = select_values(<<~SQL.squish, "temporary tables to drop at structure dump")
|
289
|
-
SELECT table_name FROM all_tables
|
291
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ table_name FROM all_tables
|
290
292
|
WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
|
291
293
|
AND secondary = 'N' AND temporary = 'Y' ORDER BY 1
|
292
294
|
SQL
|
@@ -321,7 +323,7 @@ module ActiveRecord #:nodoc:
|
|
321
323
|
# return [{'column_name' => 'FOOS', 'data_default' => '...'}, ...]
|
322
324
|
def virtual_columns_for(table)
|
323
325
|
select_all(<<~SQL.squish, "virtual columns for")
|
324
|
-
SELECT column_name, data_default
|
326
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ column_name, data_default
|
325
327
|
FROM all_tab_cols
|
326
328
|
WHERE virtual_column = 'YES'
|
327
329
|
AND owner = SYS_CONTEXT('userenv', 'current_schema')
|
@@ -332,7 +334,7 @@ module ActiveRecord #:nodoc:
|
|
332
334
|
def drop_sql_for_feature(type)
|
333
335
|
short_type = type == "materialized view" ? "mview" : type
|
334
336
|
features = select_values(<<~SQL.squish, "features to drop")
|
335
|
-
SELECT #{short_type}_name FROM all_#{short_type.tableize}
|
337
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ #{short_type}_name FROM all_#{short_type.tableize}
|
336
338
|
where owner = SYS_CONTEXT('userenv', 'current_schema')
|
337
339
|
SQL
|
338
340
|
statements = features.map do |name|
|
@@ -343,7 +345,7 @@ module ActiveRecord #:nodoc:
|
|
343
345
|
|
344
346
|
def drop_sql_for_object(type)
|
345
347
|
objects = select_values(<<~SQL.squish, "objects to drop")
|
346
|
-
SELECT object_name FROM all_objects
|
348
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ object_name FROM all_objects
|
347
349
|
WHERE object_type = '#{type.upcase}' and owner = SYS_CONTEXT('userenv', 'current_schema')
|
348
350
|
SQL
|
349
351
|
statements = objects.map do |name|
|
@@ -449,7 +449,7 @@ module ActiveRecord
|
|
449
449
|
# when inserting a new database record (see #prefetch_primary_key?).
|
450
450
|
def next_sequence_value(sequence_name)
|
451
451
|
# if sequence_name is set to :autogenerated then it means that primary key will be populated by trigger
|
452
|
-
raise ArgumentError "Trigger based primary key is not supported" if sequence_name == AUTOGENERATED_SEQUENCE_NAME
|
452
|
+
raise ArgumentError.new "Trigger based primary key is not supported" if sequence_name == AUTOGENERATED_SEQUENCE_NAME
|
453
453
|
# call directly connection method to avoid prepared statement which causes fetching of next sequence value twice
|
454
454
|
select_value(<<~SQL.squish, "next sequence value")
|
455
455
|
SELECT #{quote_table_name(sequence_name)}.NEXTVAL FROM dual
|
@@ -526,7 +526,7 @@ module ActiveRecord
|
|
526
526
|
# Default tablespace name of current user
|
527
527
|
def default_tablespace
|
528
528
|
select_value(<<~SQL.squish, "default tablespace")
|
529
|
-
SELECT LOWER(default_tablespace) FROM user_users
|
529
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ LOWER(default_tablespace) FROM user_users
|
530
530
|
WHERE username = SYS_CONTEXT('userenv', 'current_schema')
|
531
531
|
SQL
|
532
532
|
end
|
@@ -535,7 +535,7 @@ module ActiveRecord
|
|
535
535
|
(owner, desc_table_name) = @connection.describe(table_name)
|
536
536
|
|
537
537
|
select_all(<<~SQL.squish, "Column definitions")
|
538
|
-
SELECT cols.column_name AS name, cols.data_type AS sql_type,
|
538
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ cols.column_name AS name, cols.data_type AS sql_type,
|
539
539
|
cols.data_default, cols.nullable, cols.virtual_column, cols.hidden_column,
|
540
540
|
cols.data_type_owner AS sql_type_owner,
|
541
541
|
DECODE(cols.data_type, 'NUMBER', data_precision,
|
@@ -567,7 +567,7 @@ module ActiveRecord
|
|
567
567
|
(owner, desc_table_name) = @connection.describe(table_name)
|
568
568
|
|
569
569
|
seqs = select_values(<<~SQL.squish, "Sequence")
|
570
|
-
select us.sequence_name
|
570
|
+
select /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ us.sequence_name
|
571
571
|
from all_sequences us
|
572
572
|
where us.sequence_owner = '#{owner}'
|
573
573
|
and us.sequence_name = upper(#{quote(default_sequence_name(desc_table_name))})
|
@@ -575,7 +575,7 @@ module ActiveRecord
|
|
575
575
|
|
576
576
|
# changed back from user_constraints to all_constraints for consistency
|
577
577
|
pks = select_values(<<~SQL.squish, "Primary Key")
|
578
|
-
SELECT cc.column_name
|
578
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ cc.column_name
|
579
579
|
FROM all_constraints c, all_cons_columns cc
|
580
580
|
WHERE c.owner = '#{owner}'
|
581
581
|
AND c.table_name = #{quote(desc_table_name)}
|
@@ -609,7 +609,7 @@ module ActiveRecord
|
|
609
609
|
(_owner, desc_table_name) = @connection.describe(table_name)
|
610
610
|
|
611
611
|
pks = select_values(<<~SQL.squish, "Primary Keys", [bind_string("table_name", desc_table_name)])
|
612
|
-
SELECT cc.column_name
|
612
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ cc.column_name
|
613
613
|
FROM all_constraints c, all_cons_columns cc
|
614
614
|
WHERE c.owner = SYS_CONTEXT('userenv', 'current_schema')
|
615
615
|
AND c.table_name = :table_name
|
@@ -639,7 +639,8 @@ module ActiveRecord
|
|
639
639
|
|
640
640
|
def temporary_table?(table_name) #:nodoc:
|
641
641
|
select_value(<<~SQL.squish, "temporary table", [bind_string("table_name", table_name.upcase)]) == "Y"
|
642
|
-
SELECT
|
642
|
+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */
|
643
|
+
temporary FROM all_tables WHERE table_name = :table_name and owner = SYS_CONTEXT('userenv', 'current_schema')
|
643
644
|
SQL
|
644
645
|
end
|
645
646
|
|
@@ -746,3 +747,26 @@ require "active_record/connection_adapters/oracle_enhanced/version"
|
|
746
747
|
module ActiveRecord
|
747
748
|
autoload :OracleEnhancedProcedures, "active_record/connection_adapters/oracle_enhanced/procedures"
|
748
749
|
end
|
750
|
+
|
751
|
+
# Backport #2070 into relese60 branch by adding some dirty monkey patch
|
752
|
+
# Because #2002 has been merged to release61 branch or newer, not available for release60 branch.
|
753
|
+
module Arel # :nodoc: all
|
754
|
+
module Visitors
|
755
|
+
class Oracle < Arel::Visitors::ToSql
|
756
|
+
private
|
757
|
+
def build_subselect(key, o)
|
758
|
+
stmt = super
|
759
|
+
stmt.orders = [] # `orders` will never be set to prevent `ORA-00907`.
|
760
|
+
stmt
|
761
|
+
end
|
762
|
+
end
|
763
|
+
class Oracle12 < Arel::Visitors::ToSql
|
764
|
+
private
|
765
|
+
def build_subselect(key, o)
|
766
|
+
stmt = super
|
767
|
+
stmt.orders = [] # `orders` will never be set to prevent `ORA-00907`.
|
768
|
+
stmt
|
769
|
+
end
|
770
|
+
end
|
771
|
+
end
|
772
|
+
end
|
@@ -150,6 +150,45 @@ describe "OracleEnhancedAdapter" do
|
|
150
150
|
end
|
151
151
|
end
|
152
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
|
+
|
153
192
|
describe "eager loading" do
|
154
193
|
before(:all) do
|
155
194
|
schema_define do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-oracle_enhanced-adapter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.0.
|
4
|
+
version: 6.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Raimonds Simanovskis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-12-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -135,7 +135,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
135
135
|
- !ruby/object:Gem::Version
|
136
136
|
version: 1.8.11
|
137
137
|
requirements: []
|
138
|
-
rubygems_version: 3.1.
|
138
|
+
rubygems_version: 3.1.4
|
139
139
|
signing_key:
|
140
140
|
specification_version: 4
|
141
141
|
summary: Oracle enhanced adapter for ActiveRecord
|