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
@@ -1,24 +1,25 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module ActiveRecord #:nodoc:
4
- module ConnectionAdapters #:nodoc:
5
- module OracleEnhanced #:nodoc:
6
- module StructureDump #:nodoc:
3
+ module ActiveRecord # :nodoc:
4
+ module ConnectionAdapters # :nodoc:
5
+ module OracleEnhanced # :nodoc:
6
+ module StructureDump # :nodoc:
7
7
  # Statements separator used in structure dump to allow loading of structure dump also with SQL*Plus
8
8
  STATEMENT_TOKEN = "\n\n/\n\n"
9
9
 
10
- def structure_dump #:nodoc:
11
- sequences = select(<<-SQL.strip.gsub(/\s+/, " "), "sequences to dump at structure dump")
12
- SELECT sequence_name, min_value, max_value, increment_by, order_flag, cycle_flag
10
+ def structure_dump # :nodoc:
11
+ sequences = select(<<~SQL.squish, "SCHEMA")
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
- where sequence_owner = SYS_CONTEXT('userenv', 'session_user') ORDER BY 1
15
+ where sequence_owner = SYS_CONTEXT('userenv', 'current_schema') ORDER BY 1
15
16
  SQL
16
17
 
17
18
  structure = sequences.map do |result|
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
- tables = select_values(<<-SQL.strip.gsub(/\s+/, " "), "tables at structure dump")
21
- SELECT table_name FROM all_tables t
21
+ tables = select_values(<<~SQL.squish, "SCHEMA")
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)
@@ -28,13 +29,13 @@ module ActiveRecord #:nodoc:
28
29
  SQL
29
30
  tables.each do |table_name|
30
31
  virtual_columns = virtual_columns_for(table_name) if supports_virtual_columns?
31
- ddl = "CREATE#{ ' GLOBAL TEMPORARY' if temporary_table?(table_name)} TABLE \"#{table_name}\" (\n".dup
32
- columns = select_all(<<-SQL.strip.gsub(/\s+/, " "), "columns at structure dump")
33
- SELECT column_name, data_type, data_length, char_used, char_length,
32
+ ddl = +"CREATE#{ ' GLOBAL TEMPORARY' if temporary_table?(table_name)} TABLE \"#{table_name}\" (\n"
33
+ columns = select_all(<<~SQL.squish, "SCHEMA", [bind_string("table_name", table_name)])
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
- WHERE table_name = '#{table_name}'
37
- AND owner = SYS_CONTEXT('userenv', 'session_user')
37
+ WHERE table_name = :table_name
38
+ AND owner = SYS_CONTEXT('userenv', 'current_schema')
38
39
  ORDER BY column_id
39
40
  SQL
40
41
  cols = columns.map do |row|
@@ -54,11 +55,13 @@ module ActiveRecord #:nodoc:
54
55
  structure << structure_dump_column_comments(table_name)
55
56
  end
56
57
 
57
- join_with_statement_token(structure) << structure_dump_fk_constraints
58
+ join_with_statement_token(structure) <<
59
+ structure_dump_fk_constraints <<
60
+ structure_dump_views
58
61
  end
59
62
 
60
- def structure_dump_column(column) #:nodoc:
61
- col = "\"#{column['column_name']}\" #{column['data_type']}".dup
63
+ def structure_dump_column(column) # :nodoc:
64
+ col = +"\"#{column['column_name']}\" #{column['data_type']}"
62
65
  if (column["data_type"] == "NUMBER") && !column["data_precision"].nil?
63
66
  col << "(#{column['data_precision'].to_i}"
64
67
  col << ",#{column['data_scale'].to_i}" if !column["data_scale"].nil?
@@ -72,9 +75,9 @@ module ActiveRecord #:nodoc:
72
75
  col
73
76
  end
74
77
 
75
- def structure_dump_virtual_column(column, data_default) #:nodoc:
76
- data_default = data_default.gsub(/"/, "")
77
- col = "\"#{column['column_name']}\" #{column['data_type']}".dup
78
+ def structure_dump_virtual_column(column, data_default) # :nodoc:
79
+ data_default = data_default.delete('"')
80
+ col = +"\"#{column['column_name']}\" #{column['data_type']}"
78
81
  if (column["data_type"] == "NUMBER") && !column["data_precision"].nil?
79
82
  col << "(#{column['data_precision'].to_i}"
80
83
  col << ",#{column['data_scale'].to_i}" if !column["data_scale"].nil?
@@ -86,18 +89,18 @@ module ActiveRecord #:nodoc:
86
89
  col << " GENERATED ALWAYS AS (#{data_default}) VIRTUAL"
87
90
  end
88
91
 
89
- def structure_dump_primary_key(table) #:nodoc:
92
+ def structure_dump_primary_key(table) # :nodoc:
90
93
  opts = { name: "", cols: [] }
91
- pks = select_all(<<-SQL.strip.gsub(/\s+/, " "), "Primary Keys")
92
- SELECT a.constraint_name, a.column_name, a.position
93
- FROM all_cons_columns a
94
- JOIN all_constraints c
95
- ON a.constraint_name = c.constraint_name
96
- WHERE c.table_name = '#{table.upcase}'
97
- AND c.constraint_type = 'P'
98
- AND a.owner = c.owner
99
- AND c.owner = SYS_CONTEXT('userenv', 'current_schema')
100
- SQL
94
+ pks = select_all(<<~SQL.squish, "SCHEMA")
95
+ SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ a.constraint_name, a.column_name, a.position
96
+ FROM all_cons_columns a
97
+ JOIN all_constraints c
98
+ ON a.constraint_name = c.constraint_name
99
+ WHERE c.table_name = '#{table.upcase}'
100
+ AND c.constraint_type = 'P'
101
+ AND a.owner = c.owner
102
+ AND c.owner = SYS_CONTEXT('userenv', 'current_schema')
103
+ SQL
101
104
  pks.each do |row|
102
105
  opts[:name] = row["constraint_name"]
103
106
  opts[:cols][row["position"] - 1] = row["column_name"]
@@ -105,18 +108,18 @@ module ActiveRecord #:nodoc:
105
108
  opts[:cols].length > 0 ? ",\n CONSTRAINT #{opts[:name]} PRIMARY KEY (#{opts[:cols].join(',')})" : ""
106
109
  end
107
110
 
108
- def structure_dump_unique_keys(table) #:nodoc:
111
+ def structure_dump_unique_keys(table) # :nodoc:
109
112
  keys = {}
110
- uks = select_all(<<-SQL.strip.gsub(/\s+/, " "), "Primary Keys")
111
- SELECT a.constraint_name, a.column_name, a.position
112
- FROM all_cons_columns a
113
- JOIN all_constraints c
114
- ON a.constraint_name = c.constraint_name
115
- WHERE c.table_name = '#{table.upcase}'
116
- AND c.constraint_type = 'U'
117
- AND a.owner = c.owner
118
- AND c.owner = SYS_CONTEXT('userenv', 'current_schema')
119
- SQL
113
+ uks = select_all(<<~SQL.squish, "SCHEMA")
114
+ SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ a.constraint_name, a.column_name, a.position
115
+ FROM all_cons_columns a
116
+ JOIN all_constraints c
117
+ ON a.constraint_name = c.constraint_name
118
+ WHERE c.table_name = '#{table.upcase}'
119
+ AND c.constraint_type = 'U'
120
+ AND a.owner = c.owner
121
+ AND c.owner = SYS_CONTEXT('userenv', 'current_schema')
122
+ SQL
120
123
  uks.each do |uk|
121
124
  keys[uk["constraint_name"]] ||= []
122
125
  keys[uk["constraint_name"]][uk["position"] - 1] = uk["column_name"]
@@ -126,7 +129,7 @@ module ActiveRecord #:nodoc:
126
129
  end
127
130
  end
128
131
 
129
- def structure_dump_indexes(table_name) #:nodoc:
132
+ def structure_dump_indexes(table_name) # :nodoc:
130
133
  indexes(table_name).map do |options|
131
134
  column_names = options.columns
132
135
  options = { name: options.name, unique: options.unique }
@@ -142,15 +145,15 @@ module ActiveRecord #:nodoc:
142
145
  end
143
146
  end
144
147
 
145
- def structure_dump_fk_constraints #:nodoc:
146
- foreign_keys = select_all(<<-SQL.strip.gsub(/\s+/, " "), "foreign keys at structure dump")
147
- SELECT table_name FROM all_tables
148
+ def structure_dump_fk_constraints # :nodoc:
149
+ foreign_keys = select_all(<<~SQL.squish, "SCHEMA")
150
+ SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ table_name FROM all_tables
148
151
  WHERE owner = SYS_CONTEXT('userenv', 'current_schema') ORDER BY 1
149
152
  SQL
150
153
  fks = foreign_keys.map do |table|
151
154
  if respond_to?(:foreign_keys) && (foreign_keys = foreign_keys(table["table_name"])).any?
152
155
  foreign_keys.map do |fk|
153
- sql = "ALTER TABLE #{quote_table_name(fk.from_table)} ADD CONSTRAINT #{quote_column_name(fk.options[:name])} ".dup
156
+ sql = +"ALTER TABLE #{quote_table_name(fk.from_table)} ADD CONSTRAINT #{quote_column_name(fk.options[:name])} "
154
157
  sql << "#{foreign_key_definition(fk.to_table, fk.options)}"
155
158
  end
156
159
  end
@@ -171,9 +174,10 @@ module ActiveRecord #:nodoc:
171
174
 
172
175
  def structure_dump_column_comments(table_name)
173
176
  comments = []
174
- columns = select_values(<<-SQL.strip.gsub(/\s+/, " "), "column comments at structure dump")
175
- SELECT column_name FROM user_tab_columns
176
- WHERE table_name = '#{table_name}' ORDER BY column_id
177
+ columns = select_values(<<~SQL.squish, "SCHEMA", [bind_string("table_name", table_name)])
178
+ SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ column_name FROM all_tab_columns
179
+ WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
180
+ AND table_name = :table_name ORDER BY column_id
177
181
  SQL
178
182
 
179
183
  columns.each do |column|
@@ -186,7 +190,7 @@ module ActiveRecord #:nodoc:
186
190
  join_with_statement_token(comments)
187
191
  end
188
192
 
189
- def foreign_key_definition(to_table, options = {}) #:nodoc:
193
+ def foreign_key_definition(to_table, options = {}) # :nodoc:
190
194
  column_sql = quote_column_name(options[:column] || "#{to_table.to_s.singularize}_id")
191
195
  references = options[:references] ? options[:references].first : nil
192
196
  references_sql = quote_column_name(options[:primary_key] || references || "id")
@@ -202,23 +206,23 @@ module ActiveRecord #:nodoc:
202
206
  sql
203
207
  end
204
208
 
205
- # Extract all stored procedures, packages, synonyms and views.
206
- def structure_dump_db_stored_code #:nodoc:
209
+ # Extract all stored procedures, packages, synonyms.
210
+ def structure_dump_db_stored_code # :nodoc:
207
211
  structure = []
208
- all_source = select_all(<<-SQL.strip.gsub(/\s+/, " "), "stored program at structure dump")
209
- SELECT DISTINCT name, type
212
+ all_source = select_all(<<~SQL.squish, "SCHEMA")
213
+ SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ DISTINCT name, type
210
214
  FROM all_source
211
215
  WHERE type IN ('PROCEDURE', 'PACKAGE', 'PACKAGE BODY', 'FUNCTION', 'TRIGGER', 'TYPE')
212
216
  AND name NOT LIKE 'BIN$%'
213
217
  AND owner = SYS_CONTEXT('userenv', 'current_schema') ORDER BY type
214
218
  SQL
215
219
  all_source.each do |source|
216
- ddl = "CREATE OR REPLACE \n".dup
217
- texts = select_all(<<-SQL.strip.gsub(/\s+/, " "), "all source at structure dump")
218
- SELECT text
220
+ ddl = +"CREATE OR REPLACE \n"
221
+ texts = select_all(<<~SQL.squish, "all source at structure dump", [bind_string("source_name", source["name"]), bind_string("source_type", source["type"])])
222
+ SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ text
219
223
  FROM all_source
220
- WHERE name = '#{source['name']}'
221
- AND type = '#{source['type']}'
224
+ WHERE name = :source_name
225
+ AND type = :source_type
222
226
  AND owner = SYS_CONTEXT('userenv', 'current_schema')
223
227
  ORDER BY line
224
228
  SQL
@@ -229,38 +233,48 @@ module ActiveRecord #:nodoc:
229
233
  structure << ddl
230
234
  end
231
235
 
232
- # export views
233
- views = select_all(<<-SQL.strip.gsub(/\s+/, " "), "views at structure dump")
234
- SELECT view_name, text FROM all_views
235
- WHERE owner = SYS_CONTEXT('userenv', 'session_user') ORDER BY view_name ASC
236
+ # export synonyms
237
+ structure << structure_dump_synonyms
238
+
239
+ join_with_statement_token(structure)
240
+ end
241
+
242
+ def structure_dump_views # :nodoc:
243
+ structure = []
244
+ views = select_all(<<~SQL.squish, "SCHEMA")
245
+ SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ view_name, text FROM all_views
246
+ WHERE owner = SYS_CONTEXT('userenv', 'current_schema') ORDER BY view_name ASC
236
247
  SQL
237
248
  views.each do |view|
238
249
  structure << "CREATE OR REPLACE FORCE VIEW #{view['view_name']} AS\n #{view['text']}"
239
250
  end
251
+ join_with_statement_token(structure)
252
+ end
240
253
 
241
- # export synonyms
242
- synonyms = select_all(<<-SQL.strip.gsub(/\s+/, " "), "synonyms at structure dump")
243
- SELECT owner, synonym_name, table_name, table_owner
254
+ def structure_dump_synonyms # :nodoc:
255
+ structure = []
256
+ synonyms = select_all(<<~SQL.squish, "SCHEMA")
257
+ SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ owner, synonym_name, table_name, table_owner
244
258
  FROM all_synonyms
245
259
  WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
246
260
  SQL
247
261
  synonyms.each do |synonym|
248
262
  structure << "CREATE OR REPLACE #{synonym['owner'] == 'PUBLIC' ? 'PUBLIC' : '' } SYNONYM #{synonym['synonym_name']}
249
- FOR #{synonym['table_owner']}.#{synonym['table_name']}"
263
+ FOR #{synonym['table_owner']}.#{synonym['table_name']}"
250
264
  end
251
-
252
265
  join_with_statement_token(structure)
253
266
  end
254
267
 
255
- def structure_drop #:nodoc:
256
- sequences = select_values(<<-SQL.strip.gsub(/\s+/, " "), "sequences to drop at structure dump")
257
- SELECT sequence_name FROM all_sequences where sequence_owner = SYS_CONTEXT('userenv', 'session_user') ORDER BY 1
268
+ def structure_drop # :nodoc:
269
+ sequences = select_values(<<~SQL.squish, "SCHEMA")
270
+ SELECT/*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */
271
+ sequence_name FROM all_sequences where sequence_owner = SYS_CONTEXT('userenv', 'current_schema') ORDER BY 1
258
272
  SQL
259
273
  statements = sequences.map do |seq|
260
274
  "DROP SEQUENCE \"#{seq}\""
261
275
  end
262
- tables = select_values(<<-SQL.strip.gsub(/\s+/, " "), "tables to drop at structure dump")
263
- SELECT table_name from all_tables t
276
+ tables = select_values(<<~SQL.squish, "SCHEMA")
277
+ SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ table_name from all_tables t
264
278
  WHERE owner = SYS_CONTEXT('userenv', 'current_schema') AND secondary = 'N'
265
279
  AND NOT EXISTS (SELECT mv.mview_name FROM all_mviews mv
266
280
  WHERE mv.owner = t.owner AND mv.mview_name = t.table_name)
@@ -274,9 +288,9 @@ module ActiveRecord #:nodoc:
274
288
  join_with_statement_token(statements)
275
289
  end
276
290
 
277
- def temp_table_drop #:nodoc:
278
- temporary_tables = select_values(<<-SQL.strip.gsub(/\s+/, " "), "temporary tables to drop at structure dump")
279
- SELECT table_name FROM all_tables
291
+ def temp_table_drop # :nodoc:
292
+ temporary_tables = select_values(<<~SQL.squish, "SCHEMA")
293
+ SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ table_name FROM all_tables
280
294
  WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
281
295
  AND secondary = 'N' AND temporary = 'Y' ORDER BY 1
282
296
  SQL
@@ -286,7 +300,7 @@ module ActiveRecord #:nodoc:
286
300
  join_with_statement_token(statements)
287
301
  end
288
302
 
289
- def full_drop(preserve_tables = false) #:nodoc:
303
+ def full_drop(preserve_tables = false) # :nodoc:
290
304
  s = preserve_tables ? [] : [structure_drop]
291
305
  s << temp_table_drop if preserve_tables
292
306
  s << drop_sql_for_feature("view")
@@ -306,24 +320,23 @@ module ActiveRecord #:nodoc:
306
320
  end
307
321
 
308
322
  private
309
-
310
323
  # Called only if `supports_virtual_columns?` returns true
311
324
  # return [{'column_name' => 'FOOS', 'data_default' => '...'}, ...]
312
325
  def virtual_columns_for(table)
313
- select_all(<<-SQL.strip.gsub(/\s+/, " "), "virtual columns for")
314
- SELECT column_name, data_default
326
+ select_all(<<~SQL.squish, "SCHEMA", [bind_string("table_name", table.upcase)])
327
+ SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ column_name, data_default
315
328
  FROM all_tab_cols
316
329
  WHERE virtual_column = 'YES'
317
- AND owner = SYS_CONTEXT('userenv', 'session_user')
318
- AND table_name = '#{table.upcase}'
330
+ AND owner = SYS_CONTEXT('userenv', 'current_schema')
331
+ AND table_name = :table_name
319
332
  SQL
320
333
  end
321
334
 
322
335
  def drop_sql_for_feature(type)
323
336
  short_type = type == "materialized view" ? "mview" : type
324
- features = select_values(<<-SQL.strip.gsub(/\s+/, " "), "features to drop")
325
- SELECT #{short_type}_name FROM all_#{short_type.tableize}
326
- where owner = SYS_CONTEXT('userenv', 'session_user')
337
+ features = select_values(<<~SQL.squish, "SCHEMA")
338
+ SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ #{short_type}_name FROM all_#{short_type.tableize}
339
+ where owner = SYS_CONTEXT('userenv', 'current_schema')
327
340
  SQL
328
341
  statements = features.map do |name|
329
342
  "DROP #{type.upcase} \"#{name}\""
@@ -332,9 +345,9 @@ module ActiveRecord #:nodoc:
332
345
  end
333
346
 
334
347
  def drop_sql_for_object(type)
335
- objects = select_values(<<-SQL.strip.gsub(/\s+/, " "), "objects to drop")
336
- SELECT object_name FROM all_objects
337
- WHERE object_type = '#{type.upcase}' and owner = SYS_CONTEXT('userenv', 'session_user')
348
+ objects = select_values(<<~SQL.squish, "SCHEMA")
349
+ SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ object_name FROM all_objects
350
+ WHERE object_type = '#{type.upcase}' and owner = SYS_CONTEXT('userenv', 'current_schema')
338
351
  SQL
339
352
  statements = objects.map do |name|
340
353
  "DROP #{type.upcase} \"#{name}\""
@@ -1,9 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveRecord
4
- module ConnectionAdapters #:nodoc:
4
+ module ConnectionAdapters # :nodoc:
5
5
  module OracleEnhanced
6
6
  class TypeMetadata < DelegateClass(ActiveRecord::ConnectionAdapters::SqlTypeMetadata) # :nodoc:
7
+ include Deduplicable
8
+
7
9
  attr_reader :virtual
8
10
 
9
11
  def initialize(type_metadata, virtual: nil)
@@ -23,7 +25,6 @@ module ActiveRecord
23
25
  end
24
26
 
25
27
  protected
26
-
27
28
  def attributes_for_hash
28
29
  [self.class, @type_metadata, virtual]
29
30
  end