activerecord-oracle_enhanced-adapter 6.0.4 → 6.1.1

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.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +108 -0
  3. data/README.md +12 -1
  4. data/VERSION +1 -1
  5. data/lib/active_record/connection_adapters/oracle_enhanced/connection.rb +2 -3
  6. data/lib/active_record/connection_adapters/oracle_enhanced/context_index.rb +0 -1
  7. data/lib/active_record/connection_adapters/oracle_enhanced/database_limits.rb +0 -9
  8. data/lib/active_record/connection_adapters/oracle_enhanced/database_statements.rb +9 -7
  9. data/lib/active_record/connection_adapters/oracle_enhanced/database_tasks.rb +4 -5
  10. data/lib/active_record/connection_adapters/oracle_enhanced/dbms_output.rb +0 -1
  11. data/lib/active_record/connection_adapters/oracle_enhanced/jdbc_connection.rb +3 -4
  12. data/lib/active_record/connection_adapters/oracle_enhanced/lob.rb +1 -2
  13. data/lib/active_record/connection_adapters/oracle_enhanced/oci_connection.rb +2 -3
  14. data/lib/active_record/connection_adapters/oracle_enhanced/procedures.rb +0 -1
  15. data/lib/active_record/connection_adapters/oracle_enhanced/quoting.rb +2 -3
  16. data/lib/active_record/connection_adapters/oracle_enhanced/schema_creation.rb +2 -3
  17. data/lib/active_record/connection_adapters/oracle_enhanced/schema_dumper.rb +16 -4
  18. data/lib/active_record/connection_adapters/oracle_enhanced/schema_statements.rb +58 -52
  19. data/lib/active_record/connection_adapters/oracle_enhanced/structure_dump.rb +38 -36
  20. data/lib/active_record/connection_adapters/oracle_enhanced/type_metadata.rb +2 -1
  21. data/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb +64 -21
  22. data/lib/active_record/type/oracle_enhanced/boolean.rb +0 -1
  23. data/lib/active_record/type/oracle_enhanced/integer.rb +0 -1
  24. data/lib/arel/visitors/oracle.rb +217 -0
  25. data/lib/arel/visitors/oracle12.rb +124 -0
  26. data/spec/active_record/connection_adapters/oracle_enhanced/connection_spec.rb +9 -3
  27. data/spec/active_record/connection_adapters/oracle_enhanced/database_tasks_spec.rb +6 -1
  28. data/spec/active_record/connection_adapters/oracle_enhanced/procedures_spec.rb +0 -1
  29. data/spec/active_record/connection_adapters/oracle_enhanced/schema_dumper_spec.rb +27 -0
  30. data/spec/active_record/connection_adapters/oracle_enhanced/structure_dump_spec.rb +2 -2
  31. data/spec/active_record/connection_adapters/oracle_enhanced_adapter_spec.rb +161 -0
  32. data/spec/active_record/oracle_enhanced/type/national_character_string_spec.rb +4 -2
  33. data/spec/spec_config.yaml.template +2 -2
  34. data/spec/spec_helper.rb +13 -2
  35. metadata +25 -23
@@ -11,8 +11,9 @@ module ActiveRecord
11
11
  # see: abstract/schema_statements.rb
12
12
 
13
13
  def tables #:nodoc:
14
- select_values(<<~SQL.squish, "tables")
15
- SELECT DECODE(table_name, UPPER(table_name), LOWER(table_name), table_name)
14
+ select_values(<<~SQL.squish, "SCHEMA")
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'
@@ -43,8 +44,8 @@ module ActiveRecord
43
44
  table_owner, table_name = default_owner, real_name
44
45
  end
45
46
 
46
- select_values(<<~SQL.squish, "table exists", [bind_string("owner", table_owner), bind_string("table_name", table_name)]).any?
47
- SELECT owner, table_name
47
+ select_values(<<~SQL.squish, "SCHEMA", [bind_string("owner", table_owner), bind_string("table_name", table_name)]).any?
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
@@ -59,20 +60,22 @@ module ActiveRecord
59
60
  end
60
61
 
61
62
  def views # :nodoc:
62
- select_values(<<~SQL.squish, "views")
63
- SELECT LOWER(view_name) FROM all_views WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
63
+ select_values(<<~SQL.squish, "SCHEMA")
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
- select_values(<<~SQL.squish, "materialized views")
69
- SELECT LOWER(mview_name) FROM all_mviews WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
70
+ select_values(<<~SQL.squish, "SCHEMA")
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
- result = select_all(<<~SQL.squish, "synonyms")
78
+ result = select_all(<<~SQL.squish, "SCHEMA")
76
79
  SELECT synonym_name, table_owner, table_name
77
80
  FROM all_synonyms where owner = SYS_CONTEXT('userenv', 'current_schema')
78
81
  SQL
@@ -87,8 +90,8 @@ module ActiveRecord
87
90
  (_owner, table_name) = @connection.describe(table_name)
88
91
  default_tablespace_name = default_tablespace
89
92
 
90
- 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,
93
+ result = select_all(<<~SQL.squish, "SCHEMA", [bind_string("table_name", table_name)])
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,
@@ -117,8 +120,8 @@ module ActiveRecord
117
120
  statement_parameters = nil
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
- source = select_values(<<~SQL.squish, "procedure", [bind_string("procedure_name", procedure_name.upcase)]).join
121
- SELECT text
123
+ source = select_values(<<~SQL.squish, "SCHEMA", [bind_string("procedure_name", procedure_name.upcase)]).join
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
@@ -196,19 +199,19 @@ module ActiveRecord
196
199
  # t.string :last_name, :comment => “Surname”
197
200
  # end
198
201
 
199
- def create_table(table_name, **options)
200
- create_sequence = options[:id] != false
201
- td = create_table_definition table_name, **options
202
+ def create_table(table_name, id: :primary_key, primary_key: nil, force: nil, **options)
203
+ create_sequence = id != false
204
+ td = create_table_definition(
205
+ table_name, **options.extract!(:temporary, :options, :as, :comment, :tablespace, :organization)
206
+ )
202
207
 
203
- if options[:id] != false && !options[:as]
204
- pk = options.fetch(:primary_key) do
205
- Base.get_primary_key table_name.to_s.singularize
206
- end
208
+ if id && !td.as
209
+ pk = primary_key || Base.get_primary_key(table_name.to_s.singularize)
207
210
 
208
211
  if pk.is_a?(Array)
209
212
  td.primary_keys pk
210
213
  else
211
- td.primary_key pk, options.fetch(:id, :primary_key), **options
214
+ td.primary_key pk, id, **options
212
215
  end
213
216
  end
214
217
 
@@ -226,8 +229,10 @@ module ActiveRecord
226
229
  yield td if block_given?
227
230
  create_sequence = create_sequence || td.create_sequence
228
231
 
229
- if options[:force] && data_source_exists?(table_name)
230
- drop_table(table_name, options)
232
+ if force && data_source_exists?(table_name)
233
+ drop_table(table_name, force: force, if_exists: true)
234
+ else
235
+ schema_cache.clear_data_source_cache!(table_name.to_s)
231
236
  end
232
237
 
233
238
  execute schema_creation.accept td
@@ -235,14 +240,14 @@ module ActiveRecord
235
240
  create_sequence_and_trigger(table_name, options) if create_sequence
236
241
 
237
242
  if supports_comments? && !supports_comments_in_create?
238
- if table_comment = options[:comment].presence
243
+ if table_comment = td.comment.presence
239
244
  change_table_comment(table_name, table_comment)
240
245
  end
241
246
  td.columns.each do |column|
242
247
  change_column_comment(table_name, column.name, column.comment) if column.comment.present?
243
248
  end
244
249
  end
245
- td.indexes.each { |c, o| add_index table_name, c, o }
250
+ td.indexes.each { |c, o| add_index table_name, c, **o }
246
251
 
247
252
  rebuild_primary_key_index_to_default_tablespace(table_name, options)
248
253
  end
@@ -251,13 +256,16 @@ module ActiveRecord
251
256
  if new_name.to_s.length > DatabaseLimits::IDENTIFIER_MAX_LENGTH
252
257
  raise ArgumentError, "New table name '#{new_name}' is too long; the limit is #{DatabaseLimits::IDENTIFIER_MAX_LENGTH} characters"
253
258
  end
259
+ schema_cache.clear_data_source_cache!(table_name.to_s)
260
+ schema_cache.clear_data_source_cache!(new_name.to_s)
254
261
  execute "RENAME #{quote_table_name(table_name)} TO #{quote_table_name(new_name)}"
255
262
  execute "RENAME #{quote_table_name("#{table_name}_seq")} TO #{default_sequence_name(new_name)}" rescue nil
256
263
 
257
264
  rename_table_indexes(table_name, new_name)
258
265
  end
259
266
 
260
- def drop_table(table_name, options = {}) #:nodoc:
267
+ def drop_table(table_name, **options) #:nodoc:
268
+ schema_cache.clear_data_source_cache!(table_name.to_s)
261
269
  execute "DROP TABLE #{quote_table_name(table_name)}#{' CASCADE CONSTRAINTS' if options[:force] == :cascade}"
262
270
  seq_name = options[:sequence_name] || default_sequence_name(table_name)
263
271
  execute "DROP SEQUENCE #{quote_table_name(seq_name)}" rescue nil
@@ -287,7 +295,7 @@ module ActiveRecord
287
295
  end
288
296
  end
289
297
 
290
- def add_index(table_name, column_name, options = {}) #:nodoc:
298
+ def add_index(table_name, column_name, **options) #:nodoc:
291
299
  index_name, index_type, quoted_column_names, tablespace, index_options = add_index_options(table_name, column_name, **options)
292
300
  execute "CREATE #{index_type} INDEX #{quote_column_name(index_name)} ON #{quote_table_name(table_name)} (#{quoted_column_names})#{tablespace} #{index_options}"
293
301
  if index_type == "UNIQUE"
@@ -306,13 +314,11 @@ module ActiveRecord
306
314
  index_type = options[:unique] ? "UNIQUE" : ""
307
315
  index_name = options[:name].to_s if options.key?(:name)
308
316
  tablespace = tablespace_for(:index, options[:tablespace])
309
- max_index_length = options.fetch(:internal, false) ? index_name_length : allowed_index_name_length
310
- # TODO: This option is used for NOLOGGING, needs better argumetn name
317
+ # TODO: This option is used for NOLOGGING, needs better argument name
311
318
  index_options = options[:options]
312
319
 
313
- if index_name.to_s.length > max_index_length
314
- raise ArgumentError, "Index name '#{index_name}' on table '#{table_name}' is too long; the limit is #{max_index_length} characters"
315
- end
320
+ validate_index_length!(table_name, index_name, options.fetch(:internal, false))
321
+
316
322
  if table_exists?(table_name) && index_name_exists?(table_name, index_name)
317
323
  raise ArgumentError, "Index name '#{index_name}' on table '#{table_name}' already exists"
318
324
  end
@@ -323,8 +329,8 @@ module ActiveRecord
323
329
 
324
330
  # Remove the given index from the table.
325
331
  # Gives warning if index does not exist
326
- def remove_index(table_name, options = {}) #:nodoc:
327
- index_name = index_name_for_remove(table_name, options)
332
+ def remove_index(table_name, column_name = nil, **options) #:nodoc:
333
+ index_name = index_name_for_remove(table_name, column_name, options)
328
334
  # TODO: It should execute only when index_type == "UNIQUE"
329
335
  execute "ALTER TABLE #{quote_table_name(table_name)} DROP CONSTRAINT #{quote_column_name(index_name)}" rescue nil
330
336
  execute "DROP INDEX #{quote_column_name(index_name)}"
@@ -361,8 +367,8 @@ module ActiveRecord
361
367
  # Will always query database and not index cache.
362
368
  def index_name_exists?(table_name, index_name)
363
369
  (_owner, table_name) = @connection.describe(table_name)
364
- result = select_value(<<~SQL.squish, "index name exists")
365
- SELECT 1 FROM all_indexes i
370
+ result = select_value(<<~SQL.squish, "SCHEMA")
371
+ SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ 1 FROM all_indexes i
366
372
  WHERE i.owner = SYS_CONTEXT('userenv', 'current_schema')
367
373
  AND i.table_owner = SYS_CONTEXT('userenv', 'current_schema')
368
374
  AND i.table_name = '#{table_name}'
@@ -440,7 +446,7 @@ module ActiveRecord
440
446
  change_column table_name, column_name, column.sql_type, null: null
441
447
  end
442
448
 
443
- def change_column(table_name, column_name, type, options = {}) #:nodoc:
449
+ def change_column(table_name, column_name, type, **options) #:nodoc:
444
450
  column = column_for(table_name, column_name)
445
451
 
446
452
  # remove :null option if its value is the same as current column definition
@@ -494,9 +500,10 @@ module ActiveRecord
494
500
  end
495
501
 
496
502
  def table_comment(table_name) #:nodoc:
503
+ # TODO
497
504
  (_owner, table_name) = @connection.describe(table_name)
498
- select_value(<<~SQL.squish, "Table comment", [bind_string("table_name", table_name)])
499
- SELECT comments FROM all_tab_comments
505
+ select_value(<<~SQL.squish, "SCHEMA", [bind_string("table_name", table_name)])
506
+ SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ comments FROM all_tab_comments
500
507
  WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
501
508
  AND table_name = :table_name
502
509
  SQL
@@ -511,8 +518,8 @@ module ActiveRecord
511
518
  def column_comment(table_name, column_name) #:nodoc:
512
519
  # TODO: it does not exist in Abstract adapter
513
520
  (_owner, table_name) = @connection.describe(table_name)
514
- 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
521
+ select_value(<<~SQL.squish, "SCHEMA", [bind_string("table_name", table_name), bind_string("column_name", column_name.upcase)])
522
+ SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ comments FROM all_col_comments
516
523
  WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
517
524
  AND table_name = :table_name
518
525
  AND column_name = :column_name
@@ -528,8 +535,8 @@ module ActiveRecord
528
535
  end
529
536
 
530
537
  def tablespace(table_name)
531
- select_value(<<~SQL.squish, "tablespace")
532
- SELECT tablespace_name
538
+ select_value(<<~SQL.squish, "SCHEMA")
539
+ SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ tablespace_name
533
540
  FROM all_tables
534
541
  WHERE table_name='#{table_name.to_s.upcase}'
535
542
  AND owner = SYS_CONTEXT('userenv', 'current_schema')
@@ -540,8 +547,8 @@ module ActiveRecord
540
547
  def foreign_keys(table_name) #:nodoc:
541
548
  (_owner, desc_table_name) = @connection.describe(table_name)
542
549
 
543
- fk_info = select_all(<<~SQL.squish, "Foreign Keys", [bind_string("desc_table_name", desc_table_name)])
544
- SELECT r.table_name to_table
550
+ fk_info = select_all(<<~SQL.squish, "SCHEMA", [bind_string("desc_table_name", desc_table_name)])
551
+ SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ r.table_name to_table
545
552
  ,rc.column_name references_column
546
553
  ,cc.column_name
547
554
  ,c.constraint_name name
@@ -582,8 +589,8 @@ module ActiveRecord
582
589
  # REFERENTIAL INTEGRITY ====================================
583
590
 
584
591
  def disable_referential_integrity(&block) #:nodoc:
585
- old_constraints = select_all(<<~SQL.squish, "Foreign Keys to disable and enable")
586
- SELECT constraint_name, owner, table_name
592
+ old_constraints = select_all(<<~SQL.squish, "SCHEMA")
593
+ SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ constraint_name, owner, table_name
587
594
  FROM all_constraints
588
595
  WHERE constraint_type = 'R'
589
596
  AND status = 'ENABLED'
@@ -614,13 +621,12 @@ module ActiveRecord
614
621
  end
615
622
 
616
623
  private
617
-
618
624
  def schema_creation
619
625
  OracleEnhanced::SchemaCreation.new self
620
626
  end
621
627
 
622
- def create_table_definition(*args, **options)
623
- OracleEnhanced::TableDefinition.new(self, *args, **options)
628
+ def create_table_definition(name, **options)
629
+ OracleEnhanced::TableDefinition.new(self, name, **options)
624
630
  end
625
631
 
626
632
  def new_column_from_field(table_name, field)
@@ -642,7 +648,7 @@ module ActiveRecord
642
648
  # If a default contains a newline these cleanup regexes need to
643
649
  # match newlines.
644
650
  field["data_default"].sub!(/^'(.*)'$/m, '\1')
645
- field["data_default"] = nil if field["data_default"] =~ /^(null|empty_[bc]lob\(\))$/i
651
+ field["data_default"] = nil if /^(null|empty_[bc]lob\(\))$/i.match?(field["data_default"])
646
652
  # TODO: Needs better fix to fallback "N" to false
647
653
  field["data_default"] = false if field["data_default"] == "N" && OracleEnhancedAdapter.emulate_booleans_from_strings
648
654
  end
@@ -699,7 +705,7 @@ module ActiveRecord
699
705
  return unless tablespace
700
706
 
701
707
  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
708
+ SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ index_name FROM all_constraints
703
709
  WHERE table_name = :table_name
704
710
  AND constraint_type = 'P'
705
711
  AND owner = SYS_CONTEXT('userenv', 'current_schema')
@@ -8,8 +8,9 @@ module ActiveRecord #:nodoc:
8
8
  STATEMENT_TOKEN = "\n\n/\n\n"
9
9
 
10
10
  def structure_dump #:nodoc:
11
- sequences = select(<<~SQL.squish, "sequences to dump at structure dump")
12
- SELECT sequence_name, min_value, max_value, increment_by, order_flag, cycle_flag
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
15
  where sequence_owner = SYS_CONTEXT('userenv', 'current_schema') ORDER BY 1
15
16
  SQL
@@ -17,8 +18,8 @@ module ActiveRecord #:nodoc:
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.squish, "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)
@@ -29,8 +30,8 @@ module ActiveRecord #:nodoc:
29
30
  tables.each do |table_name|
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
- columns = select_all(<<~SQL.squish, "columns at structure dump")
33
- SELECT column_name, data_type, data_length, char_used, char_length,
33
+ columns = select_all(<<~SQL.squish, "SCHEMA")
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}'
@@ -54,8 +55,9 @@ 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) << structure_dump_views
58
+ join_with_statement_token(structure) <<
59
+ structure_dump_fk_constraints <<
60
+ structure_dump_views
59
61
  end
60
62
 
61
63
  def structure_dump_column(column) #:nodoc:
@@ -89,8 +91,8 @@ module ActiveRecord #:nodoc:
89
91
 
90
92
  def structure_dump_primary_key(table) #:nodoc:
91
93
  opts = { name: "", cols: [] }
92
- pks = select_all(<<~SQL.squish, "Primary Keys")
93
- SELECT a.constraint_name, a.column_name, a.position
94
+ pks = select_all(<<~SQL.squish, "SCHEMA")
95
+ SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ a.constraint_name, a.column_name, a.position
94
96
  FROM all_cons_columns a
95
97
  JOIN all_constraints c
96
98
  ON a.constraint_name = c.constraint_name
@@ -108,8 +110,8 @@ module ActiveRecord #:nodoc:
108
110
 
109
111
  def structure_dump_unique_keys(table) #:nodoc:
110
112
  keys = {}
111
- uks = select_all(<<~SQL.squish, "Primary Keys")
112
- SELECT a.constraint_name, a.column_name, a.position
113
+ uks = select_all(<<~SQL.squish, "SCHEMA")
114
+ SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ a.constraint_name, a.column_name, a.position
113
115
  FROM all_cons_columns a
114
116
  JOIN all_constraints c
115
117
  ON a.constraint_name = c.constraint_name
@@ -144,8 +146,8 @@ module ActiveRecord #:nodoc:
144
146
  end
145
147
 
146
148
  def structure_dump_fk_constraints #:nodoc:
147
- foreign_keys = select_all(<<~SQL.squish, "foreign keys at structure dump")
148
- SELECT table_name FROM all_tables
149
+ foreign_keys = select_all(<<~SQL.squish, "SCHEMA")
150
+ SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ table_name FROM all_tables
149
151
  WHERE owner = SYS_CONTEXT('userenv', 'current_schema') ORDER BY 1
150
152
  SQL
151
153
  fks = foreign_keys.map do |table|
@@ -172,8 +174,8 @@ module ActiveRecord #:nodoc:
172
174
 
173
175
  def structure_dump_column_comments(table_name)
174
176
  comments = []
175
- columns = select_values(<<~SQL.squish, "column comments at structure dump")
176
- SELECT column_name FROM user_tab_columns
177
+ columns = select_values(<<~SQL.squish, "SCHEMA")
178
+ SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ column_name FROM user_tab_columns
177
179
  WHERE table_name = '#{table_name}' ORDER BY column_id
178
180
  SQL
179
181
 
@@ -206,8 +208,8 @@ module ActiveRecord #:nodoc:
206
208
  # Extract all stored procedures, packages, synonyms.
207
209
  def structure_dump_db_stored_code #:nodoc:
208
210
  structure = []
209
- all_source = select_all(<<~SQL.squish, "stored program at structure dump")
210
- SELECT DISTINCT name, type
211
+ all_source = select_all(<<~SQL.squish, "SCHEMA")
212
+ SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ DISTINCT name, type
211
213
  FROM all_source
212
214
  WHERE type IN ('PROCEDURE', 'PACKAGE', 'PACKAGE BODY', 'FUNCTION', 'TRIGGER', 'TYPE')
213
215
  AND name NOT LIKE 'BIN$%'
@@ -216,7 +218,7 @@ module ActiveRecord #:nodoc:
216
218
  all_source.each do |source|
217
219
  ddl = +"CREATE OR REPLACE \n"
218
220
  texts = select_all(<<~SQL.squish, "all source at structure dump")
219
- SELECT text
221
+ SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ text
220
222
  FROM all_source
221
223
  WHERE name = '#{source['name']}'
222
224
  AND type = '#{source['type']}'
@@ -238,8 +240,8 @@ module ActiveRecord #:nodoc:
238
240
 
239
241
  def structure_dump_views #:nodoc:
240
242
  structure = []
241
- views = select_all(<<~SQL.squish, "views at structure dump")
242
- SELECT view_name, text FROM all_views
243
+ views = select_all(<<~SQL.squish, "SCHEMA")
244
+ SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ view_name, text FROM all_views
243
245
  WHERE owner = SYS_CONTEXT('userenv', 'current_schema') ORDER BY view_name ASC
244
246
  SQL
245
247
  views.each do |view|
@@ -250,8 +252,8 @@ module ActiveRecord #:nodoc:
250
252
 
251
253
  def structure_dump_synonyms #:nodoc:
252
254
  structure = []
253
- synonyms = select_all(<<~SQL.squish, "synonyms at structure dump")
254
- SELECT owner, synonym_name, table_name, table_owner
255
+ synonyms = select_all(<<~SQL.squish, "SCHEMA")
256
+ SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ owner, synonym_name, table_name, table_owner
255
257
  FROM all_synonyms
256
258
  WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
257
259
  SQL
@@ -263,14 +265,15 @@ module ActiveRecord #:nodoc:
263
265
  end
264
266
 
265
267
  def structure_drop #:nodoc:
266
- sequences = select_values(<<~SQL.squish, "sequences to drop at structure dump")
267
- SELECT sequence_name FROM all_sequences where sequence_owner = SYS_CONTEXT('userenv', 'current_schema') ORDER BY 1
268
+ sequences = select_values(<<~SQL.squish, "SCHEMA")
269
+ SELECT/*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */
270
+ sequence_name FROM all_sequences where sequence_owner = SYS_CONTEXT('userenv', 'current_schema') ORDER BY 1
268
271
  SQL
269
272
  statements = sequences.map do |seq|
270
273
  "DROP SEQUENCE \"#{seq}\""
271
274
  end
272
- tables = select_values(<<~SQL.squish, "tables to drop at structure dump")
273
- SELECT table_name from all_tables t
275
+ tables = select_values(<<~SQL.squish, "SCHEMA")
276
+ SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ table_name from all_tables t
274
277
  WHERE owner = SYS_CONTEXT('userenv', 'current_schema') AND secondary = 'N'
275
278
  AND NOT EXISTS (SELECT mv.mview_name FROM all_mviews mv
276
279
  WHERE mv.owner = t.owner AND mv.mview_name = t.table_name)
@@ -285,8 +288,8 @@ module ActiveRecord #:nodoc:
285
288
  end
286
289
 
287
290
  def temp_table_drop #:nodoc:
288
- temporary_tables = select_values(<<~SQL.squish, "temporary tables to drop at structure dump")
289
- SELECT table_name FROM all_tables
291
+ temporary_tables = select_values(<<~SQL.squish, "SCHEMA")
292
+ SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ table_name FROM all_tables
290
293
  WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
291
294
  AND secondary = 'N' AND temporary = 'Y' ORDER BY 1
292
295
  SQL
@@ -316,12 +319,11 @@ module ActiveRecord #:nodoc:
316
319
  end
317
320
 
318
321
  private
319
-
320
322
  # Called only if `supports_virtual_columns?` returns true
321
323
  # return [{'column_name' => 'FOOS', 'data_default' => '...'}, ...]
322
324
  def virtual_columns_for(table)
323
- select_all(<<~SQL.squish, "virtual columns for")
324
- SELECT column_name, data_default
325
+ select_all(<<~SQL.squish, "SCHEMA")
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')
@@ -331,8 +333,8 @@ module ActiveRecord #:nodoc:
331
333
 
332
334
  def drop_sql_for_feature(type)
333
335
  short_type = type == "materialized view" ? "mview" : type
334
- features = select_values(<<~SQL.squish, "features to drop")
335
- SELECT #{short_type}_name FROM all_#{short_type.tableize}
336
+ features = select_values(<<~SQL.squish, "SCHEMA")
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|
@@ -342,8 +344,8 @@ module ActiveRecord #:nodoc:
342
344
  end
343
345
 
344
346
  def drop_sql_for_object(type)
345
- objects = select_values(<<~SQL.squish, "objects to drop")
346
- SELECT object_name FROM all_objects
347
+ objects = select_values(<<~SQL.squish, "SCHEMA")
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|