activerecord-oracle_enhanced-adapter 6.0.0.beta1 → 6.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.md +25 -1
- data/VERSION +1 -1
- data/lib/active_record/connection_adapters/oracle_enhanced/column.rb +2 -2
- data/lib/active_record/connection_adapters/oracle_enhanced/connection.rb +21 -21
- data/lib/active_record/connection_adapters/oracle_enhanced/context_index.rb +57 -57
- data/lib/active_record/connection_adapters/oracle_enhanced/database_statements.rb +3 -3
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_creation.rb +5 -5
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_dumper.rb +5 -2
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_statements.rb +41 -40
- data/lib/active_record/connection_adapters/oracle_enhanced/structure_dump.rb +35 -35
- data/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb +26 -22
- data/spec/active_record/connection_adapters/oracle_enhanced/connection_spec.rb +1 -1
- 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 +2 -2
- data/spec/active_record/connection_adapters/oracle_enhanced/schema_dumper_spec.rb +1 -1
- data/spec/active_record/connection_adapters/oracle_enhanced/structure_dump_spec.rb +24 -24
- data/spec/active_record/connection_adapters/oracle_enhanced_data_types_spec.rb +2 -2
- data/spec/active_record/oracle_enhanced/type/boolean_spec.rb +2 -2
- data/spec/active_record/oracle_enhanced/type/character_string_spec.rb +1 -1
- data/spec/active_record/oracle_enhanced/type/integer_spec.rb +2 -2
- data/spec/active_record/oracle_enhanced/type/national_character_string_spec.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 20b3aea35f3c42e8485b1b11ec0c5a549e0571b81522e5608abea0a6916d38f8
|
4
|
+
data.tar.gz: 53379822a99628e864639ed410712386bbf025de3c75ac5f9aa99e33fa0cf170
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9c928e3b86ca4f34e45ad25ca37737f605fddfae4ae5b9205812f05079655a46fa748aa6f70d926b41269574bcc811bb297396ae60325a10211ffb3854b6b08e
|
7
|
+
data.tar.gz: 1e8e54cab8bb27dc6754f559a19ee5ed60dfcad8835b6352ffd60304cd122294f326bf02bf93bd458410f8d319d2e707457d09292a9bfde56dcddc041e53e0fd
|
data/History.md
CHANGED
@@ -1,4 +1,28 @@
|
|
1
|
-
## 6.0.0.
|
1
|
+
## 6.0.0.rc1 / 2019-04-25
|
2
|
+
|
3
|
+
* Major changes
|
4
|
+
* Support Rails 6.0.0 rc1
|
5
|
+
* Address `ORA-01795: maximum number of expressions in a list is 1000`
|
6
|
+
- These changes has been made to Rails itself [rails/rails#35838, rails/rails#36074]
|
7
|
+
|
8
|
+
* Changes and bug fixes
|
9
|
+
* Cache database version in schema cache [#1859]
|
10
|
+
* Except `table_name` from column objects [#1860]
|
11
|
+
* Remove unused `sequence_name` in `sql_for_insert` [#1861]
|
12
|
+
* Use squiggly heredoc to strip odd indentation in the executed SQL [#1869]
|
13
|
+
* Use Active Support `String#squish` instead of `String#strip.gsub` [#1871]
|
14
|
+
|
15
|
+
* CI
|
16
|
+
* Revert "Add `allow_railures` for jruby-head until #1833 resolved" [#1862]
|
17
|
+
* CI against JRuby 9.2.7.0 [#1864]
|
18
|
+
* Use newer Code Climate analysis model, version 2 [#1868]
|
19
|
+
* CI against Ruby 2.6.3 [#1870]
|
20
|
+
|
21
|
+
* RuboCop
|
22
|
+
* Bump RuboCop version to 0.67 [#1867]
|
23
|
+
* Enable `Layout/SpaceBeforeComment` cop [#1863]
|
24
|
+
|
25
|
+
## 6.0.0.beta1 / 2019-03-18
|
2
26
|
|
3
27
|
* Major changes
|
4
28
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
6.0.0.
|
1
|
+
6.0.0.rc1
|
@@ -6,8 +6,8 @@ module ActiveRecord
|
|
6
6
|
class Column < ActiveRecord::ConnectionAdapters::Column
|
7
7
|
delegate :virtual, to: :sql_type_metadata, allow_nil: true
|
8
8
|
|
9
|
-
def initialize(name, default, sql_type_metadata = nil, null = true,
|
10
|
-
super(name, default, sql_type_metadata, null,
|
9
|
+
def initialize(name, default, sql_type_metadata = nil, null = true, comment: nil) #:nodoc:
|
10
|
+
super(name, default, sql_type_metadata, null, comment: comment)
|
11
11
|
end
|
12
12
|
|
13
13
|
def virtual?
|
@@ -34,27 +34,27 @@ module ActiveRecord
|
|
34
34
|
else
|
35
35
|
table_owner, table_name = default_owner, real_name
|
36
36
|
end
|
37
|
-
sql =
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
37
|
+
sql = <<~SQL.squish
|
38
|
+
SELECT owner, table_name, 'TABLE' name_type
|
39
|
+
FROM all_tables
|
40
|
+
WHERE owner = '#{table_owner}'
|
41
|
+
AND table_name = '#{table_name}'
|
42
|
+
UNION ALL
|
43
|
+
SELECT owner, view_name table_name, 'VIEW' name_type
|
44
|
+
FROM all_views
|
45
|
+
WHERE owner = '#{table_owner}'
|
46
|
+
AND view_name = '#{table_name}'
|
47
|
+
UNION ALL
|
48
|
+
SELECT table_owner, table_name, 'SYNONYM' name_type
|
49
|
+
FROM all_synonyms
|
50
|
+
WHERE owner = '#{table_owner}'
|
51
|
+
AND synonym_name = '#{table_name}'
|
52
|
+
UNION ALL
|
53
|
+
SELECT table_owner, table_name, 'SYNONYM' name_type
|
54
|
+
FROM all_synonyms
|
55
|
+
WHERE owner = 'PUBLIC'
|
56
|
+
AND synonym_name = '#{real_name}'
|
57
|
+
SQL
|
58
58
|
if result = _select_one(sql)
|
59
59
|
case result["name_type"]
|
60
60
|
when "SYNONYM"
|
@@ -149,56 +149,56 @@ module ActiveRecord
|
|
149
149
|
select_queries = select_queries.map { |s| s.strip.gsub(/\s+/, " ") }
|
150
150
|
keys, selected_columns = parse_select_queries(select_queries)
|
151
151
|
quoted_column_names = (column_names + keys).map { |col| quote_column_name(col) }
|
152
|
-
execute
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
#{
|
158
|
-
selected_columns.map do |cols|
|
159
|
-
cols.map do |col|
|
160
|
-
raise ArgumentError, "Alias #{col} too large, should be 28 or less characters long" unless col.length <= 28
|
161
|
-
"l_#{col} VARCHAR2(32767);\n"
|
162
|
-
end.join
|
163
|
-
end.join
|
164
|
-
} BEGIN
|
165
|
-
FOR r1 IN (
|
166
|
-
SELECT #{quoted_column_names.join(', ')}
|
167
|
-
FROM #{quoted_table_name}
|
168
|
-
WHERE #{quoted_table_name}.ROWID = p_rowid
|
169
|
-
) LOOP
|
152
|
+
execute <<~SQL
|
153
|
+
CREATE OR REPLACE PROCEDURE #{quote_table_name(procedure_name)}
|
154
|
+
(p_rowid IN ROWID,
|
155
|
+
p_clob IN OUT NOCOPY CLOB) IS
|
156
|
+
-- add_context_index_parameters #{(column_names + select_queries).inspect}#{!options.empty? ? +', ' << options.inspect[1..-2] : ''}
|
170
157
|
#{
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
(cols.map do |col|
|
186
|
-
"l_#{col} := l_#{col} || r2.#{col} || CHR(10);\n"
|
187
|
-
end.join) <<
|
188
|
-
"END LOOP;\n" <<
|
189
|
-
(cols.map do |col|
|
158
|
+
selected_columns.map do |cols|
|
159
|
+
cols.map do |col|
|
160
|
+
raise ArgumentError, "Alias #{col} too large, should be 28 or less characters long" unless col.length <= 28
|
161
|
+
"l_#{col} VARCHAR2(32767);\n"
|
162
|
+
end.join
|
163
|
+
end.join
|
164
|
+
} BEGIN
|
165
|
+
FOR r1 IN (
|
166
|
+
SELECT #{quoted_column_names.join(', ')}
|
167
|
+
FROM #{quoted_table_name}
|
168
|
+
WHERE #{quoted_table_name}.ROWID = p_rowid
|
169
|
+
) LOOP
|
170
|
+
#{
|
171
|
+
(column_names.map do |col|
|
190
172
|
col = col.to_s
|
191
173
|
+"DBMS_LOB.WRITEAPPEND(p_clob, #{col.length + 2}, '<#{col}>');\n" <<
|
192
|
-
"IF LENGTH(
|
193
|
-
"DBMS_LOB.WRITEAPPEND(p_clob, LENGTH(
|
174
|
+
"IF LENGTH(r1.#{col}) > 0 THEN\n" <<
|
175
|
+
"DBMS_LOB.WRITEAPPEND(p_clob, LENGTH(r1.#{col}), r1.#{col});\n" <<
|
194
176
|
"END IF;\n" <<
|
195
177
|
"DBMS_LOB.WRITEAPPEND(p_clob, #{col.length + 3}, '</#{col}>');\n"
|
178
|
+
end.join) <<
|
179
|
+
(selected_columns.zip(select_queries).map do |cols, query|
|
180
|
+
(cols.map do |col|
|
181
|
+
"l_#{col} := '';\n"
|
182
|
+
end.join) <<
|
183
|
+
"FOR r2 IN (\n" <<
|
184
|
+
query.gsub(/:(\w+)/, "r1.\\1") << "\n) LOOP\n" <<
|
185
|
+
(cols.map do |col|
|
186
|
+
"l_#{col} := l_#{col} || r2.#{col} || CHR(10);\n"
|
187
|
+
end.join) <<
|
188
|
+
"END LOOP;\n" <<
|
189
|
+
(cols.map do |col|
|
190
|
+
col = col.to_s
|
191
|
+
+"DBMS_LOB.WRITEAPPEND(p_clob, #{col.length + 2}, '<#{col}>');\n" <<
|
192
|
+
"IF LENGTH(l_#{col}) > 0 THEN\n" <<
|
193
|
+
"DBMS_LOB.WRITEAPPEND(p_clob, LENGTH(l_#{col}), l_#{col});\n" <<
|
194
|
+
"END IF;\n" <<
|
195
|
+
"DBMS_LOB.WRITEAPPEND(p_clob, #{col.length + 3}, '</#{col}>');\n"
|
196
|
+
end.join)
|
196
197
|
end.join)
|
197
|
-
|
198
|
-
|
199
|
-
END
|
200
|
-
|
201
|
-
SQL
|
198
|
+
}
|
199
|
+
END LOOP;
|
200
|
+
END;
|
201
|
+
SQL
|
202
202
|
end
|
203
203
|
|
204
204
|
def parse_select_queries(select_queries)
|
@@ -215,12 +215,12 @@ module ActiveRecord
|
|
215
215
|
|
216
216
|
def create_datastore_preference(datastore_name, procedure_name)
|
217
217
|
drop_ctx_preference(datastore_name)
|
218
|
-
execute
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
218
|
+
execute <<~SQL
|
219
|
+
BEGIN
|
220
|
+
CTX_DDL.CREATE_PREFERENCE('#{datastore_name}', 'USER_DATASTORE');
|
221
|
+
CTX_DDL.SET_ATTRIBUTE('#{datastore_name}', 'PROCEDURE', '#{procedure_name}');
|
222
|
+
END;
|
223
|
+
SQL
|
224
224
|
end
|
225
225
|
|
226
226
|
def create_storage_preference(storage_name, tablespace)
|
@@ -281,13 +281,13 @@ module ActiveRecord
|
|
281
281
|
trigger_name = default_index_column_trigger_name(index_name)
|
282
282
|
columns = Array(index_column_source)
|
283
283
|
quoted_column_names = columns.map { |col| quote_column_name(col) }.join(", ")
|
284
|
-
execute
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
284
|
+
execute <<~SQL
|
285
|
+
CREATE OR REPLACE TRIGGER #{quote_table_name(trigger_name)}
|
286
|
+
BEFORE UPDATE OF #{quoted_column_names} ON #{quote_table_name(table_name)} FOR EACH ROW
|
287
|
+
BEGIN
|
288
|
+
:new.#{quote_column_name(index_column)} := '1';
|
289
|
+
END;
|
290
|
+
SQL
|
291
291
|
end
|
292
292
|
|
293
293
|
def drop_index_column_trigger(index_name)
|
@@ -76,7 +76,7 @@ module ActiveRecord
|
|
76
76
|
|
77
77
|
# New method in ActiveRecord 3.1
|
78
78
|
# Will add RETURNING clause in case of trigger generated primary keys
|
79
|
-
def sql_for_insert(sql, pk,
|
79
|
+
def sql_for_insert(sql, pk, binds)
|
80
80
|
unless pk == false || pk.nil? || pk.is_a?(Array)
|
81
81
|
sql = "#{sql} RETURNING #{quote_column_name(pk)} INTO :returning_id"
|
82
82
|
(binds = binds.dup) << ActiveRecord::Relation::QueryAttribute.new("returning_id", nil, Type::OracleEnhanced::Integer.new)
|
@@ -91,7 +91,7 @@ module ActiveRecord
|
|
91
91
|
|
92
92
|
# New method in ActiveRecord 3.1
|
93
93
|
def exec_insert(sql, name = nil, binds = [], pk = nil, sequence_name = nil)
|
94
|
-
sql, binds = sql_for_insert(sql, pk,
|
94
|
+
sql, binds = sql_for_insert(sql, pk, binds)
|
95
95
|
type_casted_binds = type_casted_binds(binds)
|
96
96
|
|
97
97
|
log(sql, name, binds, type_casted_binds) do
|
@@ -252,7 +252,7 @@ module ActiveRecord
|
|
252
252
|
value = klass.attribute_types[col.name].serialize(value)
|
253
253
|
end
|
254
254
|
uncached do
|
255
|
-
unless lob_record = select_one(
|
255
|
+
unless lob_record = select_one(<<~SQL.squish, "Writable Large Object")
|
256
256
|
SELECT #{quote_column_name(col.name)} FROM #{quote_table_name(table_name)}
|
257
257
|
WHERE #{quote_column_name(klass.primary_key)} = #{id} FOR UPDATE
|
258
258
|
SQL
|
@@ -76,17 +76,17 @@ module ActiveRecord
|
|
76
76
|
def action_sql(action, dependency)
|
77
77
|
if action == "UPDATE"
|
78
78
|
raise ArgumentError, <<~MSG
|
79
|
-
|
80
|
-
|
79
|
+
'#{action}' is not supported by Oracle
|
80
|
+
MSG
|
81
81
|
end
|
82
82
|
case dependency
|
83
83
|
when :nullify then "ON #{action} SET NULL"
|
84
84
|
when :cascade then "ON #{action} CASCADE"
|
85
85
|
else
|
86
86
|
raise ArgumentError, <<~MSG
|
87
|
-
|
88
|
-
|
89
|
-
|
87
|
+
'#{dependency}' is not supported for #{action}
|
88
|
+
Supported values are: :nullify, :cascade
|
89
|
+
MSG
|
90
90
|
end
|
91
91
|
end
|
92
92
|
end
|
@@ -85,6 +85,8 @@ module ActiveRecord #:nodoc:
|
|
85
85
|
def table(table, stream)
|
86
86
|
columns = @connection.columns(table)
|
87
87
|
begin
|
88
|
+
self.table_name = table
|
89
|
+
|
88
90
|
tbl = StringIO.new
|
89
91
|
|
90
92
|
# first dump primary key column
|
@@ -144,6 +146,8 @@ module ActiveRecord #:nodoc:
|
|
144
146
|
stream.puts "# Could not dump table #{table.inspect} because of following #{e.class}"
|
145
147
|
stream.puts "# #{e.message}"
|
146
148
|
stream.puts
|
149
|
+
ensure
|
150
|
+
self.table_name = nil
|
147
151
|
end
|
148
152
|
end
|
149
153
|
|
@@ -164,8 +168,7 @@ module ActiveRecord #:nodoc:
|
|
164
168
|
|
165
169
|
def extract_expression_for_virtual_column(column)
|
166
170
|
column_name = column.name
|
167
|
-
table_name
|
168
|
-
@connection.select_value(<<-SQL.strip.gsub(/\s+/, " "), "Table comment", [bind_string("table_name", table_name.upcase), bind_string("column_name", column_name.upcase)]).inspect
|
171
|
+
@connection.select_value(<<~SQL.squish, "Table comment", [bind_string("table_name", table_name.upcase), bind_string("column_name", column_name.upcase)]).inspect
|
169
172
|
select data_default from all_tab_columns
|
170
173
|
where owner = SYS_CONTEXT('userenv', 'current_schema')
|
171
174
|
and table_name = :table_name
|
@@ -11,16 +11,16 @@ module ActiveRecord
|
|
11
11
|
# see: abstract/schema_statements.rb
|
12
12
|
|
13
13
|
def tables #:nodoc:
|
14
|
-
select_values(
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
14
|
+
select_values(<<~SQL.squish, "tables")
|
15
|
+
SELECT DECODE(table_name, UPPER(table_name), LOWER(table_name), table_name)
|
16
|
+
FROM all_tables
|
17
|
+
WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
|
18
|
+
AND secondary = 'N'
|
19
|
+
minus
|
20
|
+
SELECT DECODE(mview_name, UPPER(mview_name), LOWER(mview_name), mview_name)
|
21
|
+
FROM all_mviews
|
22
|
+
WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
|
23
|
+
SQL
|
24
24
|
end
|
25
25
|
|
26
26
|
def data_sources
|
@@ -43,12 +43,12 @@ module ActiveRecord
|
|
43
43
|
table_owner, table_name = default_owner, real_name
|
44
44
|
end
|
45
45
|
|
46
|
-
select_values(
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
46
|
+
select_values(<<~SQL.squish, "table exists", [bind_string("owner", table_owner), bind_string("table_name", table_name)]).any?
|
47
|
+
SELECT owner, table_name
|
48
|
+
FROM all_tables
|
49
|
+
WHERE owner = :owner
|
50
|
+
AND table_name = :table_name
|
51
|
+
SQL
|
52
52
|
end
|
53
53
|
|
54
54
|
def data_source_exists?(table_name)
|
@@ -59,23 +59,23 @@ module ActiveRecord
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def views # :nodoc:
|
62
|
-
select_values(
|
62
|
+
select_values(<<~SQL.squish, "views")
|
63
63
|
SELECT LOWER(view_name) FROM all_views WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
|
64
64
|
SQL
|
65
65
|
end
|
66
66
|
|
67
67
|
def materialized_views #:nodoc:
|
68
|
-
select_values(
|
68
|
+
select_values(<<~SQL.squish, "materialized views")
|
69
69
|
SELECT LOWER(mview_name) FROM all_mviews WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
|
70
70
|
SQL
|
71
71
|
end
|
72
72
|
|
73
73
|
# get synonyms for schema dump
|
74
74
|
def synonyms
|
75
|
-
result = select_all(
|
76
|
-
|
77
|
-
|
78
|
-
|
75
|
+
result = select_all(<<~SQL.squish, "synonyms")
|
76
|
+
SELECT synonym_name, table_owner, table_name
|
77
|
+
FROM all_synonyms where owner = SYS_CONTEXT('userenv', 'current_schema')
|
78
|
+
SQL
|
79
79
|
|
80
80
|
result.collect do |row|
|
81
81
|
OracleEnhanced::SynonymDefinition.new(oracle_downcase(row["synonym_name"]),
|
@@ -87,7 +87,7 @@ module ActiveRecord
|
|
87
87
|
(_owner, table_name) = @connection.describe(table_name)
|
88
88
|
default_tablespace_name = default_tablespace
|
89
89
|
|
90
|
-
result = select_all(
|
90
|
+
result = select_all(<<~SQL.squish, "indexes", [bind_string("table_name", table_name)])
|
91
91
|
SELECT LOWER(i.table_name) AS table_name, LOWER(i.index_name) AS index_name, i.uniqueness,
|
92
92
|
i.index_type, i.ityp_owner, i.ityp_name, i.parameters,
|
93
93
|
LOWER(i.tablespace_name) AS tablespace_name,
|
@@ -117,7 +117,7 @@ module ActiveRecord
|
|
117
117
|
statement_parameters = nil
|
118
118
|
if row["index_type"] == "DOMAIN" && row["ityp_owner"] == "CTXSYS" && row["ityp_name"] == "CONTEXT"
|
119
119
|
procedure_name = default_datastore_procedure(row["index_name"])
|
120
|
-
source = select_values(
|
120
|
+
source = select_values(<<~SQL.squish, "procedure", [bind_string("procedure_name", procedure_name.upcase)]).join
|
121
121
|
SELECT text
|
122
122
|
FROM all_source
|
123
123
|
WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
|
@@ -361,7 +361,7 @@ module ActiveRecord
|
|
361
361
|
# Will always query database and not index cache.
|
362
362
|
def index_name_exists?(table_name, index_name)
|
363
363
|
(_owner, table_name) = @connection.describe(table_name)
|
364
|
-
result = select_value(
|
364
|
+
result = select_value(<<~SQL.squish, "index name exists")
|
365
365
|
SELECT 1 FROM all_indexes i
|
366
366
|
WHERE i.owner = SYS_CONTEXT('userenv', 'current_schema')
|
367
367
|
AND i.table_owner = SYS_CONTEXT('userenv', 'current_schema')
|
@@ -477,8 +477,9 @@ module ActiveRecord
|
|
477
477
|
clear_table_columns_cache(table_name)
|
478
478
|
end
|
479
479
|
|
480
|
-
def change_table_comment(table_name,
|
480
|
+
def change_table_comment(table_name, comment_or_changes)
|
481
481
|
clear_cache!
|
482
|
+
comment = extract_new_comment_value(comment_or_changes)
|
482
483
|
if comment.nil?
|
483
484
|
execute "COMMENT ON TABLE #{quote_table_name(table_name)} IS ''"
|
484
485
|
else
|
@@ -486,14 +487,15 @@ module ActiveRecord
|
|
486
487
|
end
|
487
488
|
end
|
488
489
|
|
489
|
-
def change_column_comment(table_name, column_name,
|
490
|
+
def change_column_comment(table_name, column_name, comment_or_changes)
|
490
491
|
clear_cache!
|
492
|
+
comment = extract_new_comment_value(comment_or_changes)
|
491
493
|
execute "COMMENT ON COLUMN #{quote_table_name(table_name)}.#{quote_column_name(column_name)} IS '#{comment}'"
|
492
494
|
end
|
493
495
|
|
494
496
|
def table_comment(table_name) #:nodoc:
|
495
497
|
(_owner, table_name) = @connection.describe(table_name)
|
496
|
-
select_value(
|
498
|
+
select_value(<<~SQL.squish, "Table comment", [bind_string("table_name", table_name)])
|
497
499
|
SELECT comments FROM all_tab_comments
|
498
500
|
WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
|
499
501
|
AND table_name = :table_name
|
@@ -509,7 +511,7 @@ module ActiveRecord
|
|
509
511
|
def column_comment(table_name, column_name) #:nodoc:
|
510
512
|
# TODO: it does not exist in Abstract adapter
|
511
513
|
(_owner, table_name) = @connection.describe(table_name)
|
512
|
-
select_value(
|
514
|
+
select_value(<<~SQL.squish, "Column comment", [bind_string("table_name", table_name), bind_string("column_name", column_name.upcase)])
|
513
515
|
SELECT comments FROM all_col_comments
|
514
516
|
WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
|
515
517
|
AND table_name = :table_name
|
@@ -526,7 +528,7 @@ module ActiveRecord
|
|
526
528
|
end
|
527
529
|
|
528
530
|
def tablespace(table_name)
|
529
|
-
select_value(
|
531
|
+
select_value(<<~SQL.squish, "tablespace")
|
530
532
|
SELECT tablespace_name
|
531
533
|
FROM all_tables
|
532
534
|
WHERE table_name='#{table_name.to_s.upcase}'
|
@@ -538,7 +540,7 @@ module ActiveRecord
|
|
538
540
|
def foreign_keys(table_name) #:nodoc:
|
539
541
|
(_owner, desc_table_name) = @connection.describe(table_name)
|
540
542
|
|
541
|
-
fk_info = select_all(
|
543
|
+
fk_info = select_all(<<~SQL.squish, "Foreign Keys", [bind_string("desc_table_name", desc_table_name)])
|
542
544
|
SELECT r.table_name to_table
|
543
545
|
,rc.column_name references_column
|
544
546
|
,cc.column_name
|
@@ -580,12 +582,12 @@ module ActiveRecord
|
|
580
582
|
# REFERENTIAL INTEGRITY ====================================
|
581
583
|
|
582
584
|
def disable_referential_integrity(&block) #:nodoc:
|
583
|
-
old_constraints = select_all(
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
585
|
+
old_constraints = select_all(<<~SQL.squish, "Foreign Keys to disable and enable")
|
586
|
+
SELECT constraint_name, owner, table_name
|
587
|
+
FROM all_constraints
|
588
|
+
WHERE constraint_type = 'R'
|
589
|
+
AND status = 'ENABLED'
|
590
|
+
AND owner = SYS_CONTEXT('userenv', 'current_schema')
|
589
591
|
SQL
|
590
592
|
begin
|
591
593
|
old_constraints.each do |constraint|
|
@@ -652,8 +654,7 @@ module ActiveRecord
|
|
652
654
|
default_value,
|
653
655
|
type_metadata,
|
654
656
|
field["nullable"] == "Y",
|
655
|
-
|
656
|
-
field["column_comment"]
|
657
|
+
comment: field["column_comment"]
|
657
658
|
)
|
658
659
|
end
|
659
660
|
|
@@ -697,7 +698,7 @@ module ActiveRecord
|
|
697
698
|
|
698
699
|
return unless tablespace
|
699
700
|
|
700
|
-
index_name = select_value(
|
701
|
+
index_name = select_value(<<~SQL.squish, "Index name for primary key", [bind_string("table_name", table_name.upcase)])
|
701
702
|
SELECT index_name FROM all_constraints
|
702
703
|
WHERE table_name = :table_name
|
703
704
|
AND constraint_type = 'P'
|