Skip to content

Commit 110b67c

Browse files
author
Gatis Tomsons
committed
New procedure argument metadata option 'defaulted'
Now it is possible to determine if a field has default arguments.
1 parent e406170 commit 110b67c

2 files changed

Lines changed: 52 additions & 3 deletions

File tree

lib/plsql/procedure.rb

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,13 @@ def get_argument_metadata #:nodoc:
100100

101101
# subprogram_id column is available just from version 10g
102102
subprogram_id_column = (@schema.connection.database_version <=> [10, 2, 0, 2]) >= 0 ? 'subprogram_id' : 'NULL'
103+
# defaulted is available just from version 11g
104+
defaulted_column = (@schema.connection.database_version <=> [11, 0, 0, 0]) >= 0 ? 'defaulted' : 'NULL'
103105

104106
@schema.select_all(
105107
"SELECT #{subprogram_id_column}, object_name, TO_NUMBER(overload), argument_name, position, data_level,
106108
data_type, in_out, data_length, data_precision, data_scale, char_used,
107-
char_length, type_owner, type_name, type_subname
109+
char_length, type_owner, type_name, type_subname, #{defaulted_column}
108110
FROM all_arguments
109111
WHERE object_id = :object_id
110112
AND owner = :owner
@@ -115,7 +117,7 @@ def get_argument_metadata #:nodoc:
115117

116118
subprogram_id, object_name, overload, argument_name, position, data_level,
117119
data_type, in_out, data_length, data_precision, data_scale, char_used,
118-
char_length, type_owner, type_name, type_subname = r
120+
char_length, type_owner, type_name, type_subname, defaulted = r
119121

120122
@overloaded ||= !overload.nil?
121123
# if not overloaded then store arguments at key 0
@@ -155,7 +157,8 @@ def get_argument_metadata #:nodoc:
155157
:type_owner => type_owner,
156158
:type_name => type_name,
157159
:type_subname => type_subname,
158-
:sql_type_name => sql_type_name
160+
:sql_type_name => sql_type_name,
161+
:defaulted => defaulted
159162
}
160163
if tmp_table_name
161164
@tmp_table_names[overload] << [(argument_metadata[:tmp_table_name] = tmp_table_name), argument_metadata]

spec/plsql/procedure_spec.rb

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2251,3 +2251,49 @@ def new_candidate(status)
22512251
end
22522252

22532253
end
2254+
2255+
describe '#get_argument_metadata' do
2256+
before(:each) do
2257+
plsql.execute <<-SQL
2258+
CREATE OR REPLACE FUNCTION magic_number(p_num INTEGER #{defaulted_clause})
2259+
RETURN INTEGER
2260+
IS
2261+
BEGIN
2262+
RETURN p_num * 2;
2263+
END magic_number;
2264+
SQL
2265+
end
2266+
2267+
after(:each) do
2268+
plsql.execute "DROP FUNCTION magic_number"
2269+
end
2270+
2271+
context 'on procedure with defaulted field' do
2272+
let(:defaulted_clause) { 'DEFAULT 21' }
2273+
2274+
it 'field\'s metadata attribute "defaulted" is Y' do
2275+
procedure = PLSQL::Procedure.find(plsql, :magic_number)
2276+
expect(procedure.arguments[0][:p_num][:defaulted]).to eq('Y')
2277+
end
2278+
end
2279+
2280+
context 'procedure without defaulted field' do
2281+
let(:defaulted_clause) { '' }
2282+
2283+
it 'field\'s metadata attribute "defaulted" is N' do
2284+
procedure = PLSQL::Procedure.find(plsql, :magic_number)
2285+
expect(procedure.arguments[0][:p_num][:defaulted]).to eq('N')
2286+
end
2287+
end
2288+
2289+
context 'oracle <= 10g without defaulted functionality' do
2290+
let(:defaulted_clause) { '' }
2291+
2292+
it 'field\'s metadata attribute "defaulted" is nil' do
2293+
allow(plsql.connection).to receive(:database_version).and_return([10, 2, 0, 2])
2294+
2295+
procedure = PLSQL::Procedure.find(plsql, :magic_number)
2296+
expect(procedure.arguments[0][:p_num][:defaulted]).to be_nil
2297+
end
2298+
end
2299+
end

0 commit comments

Comments
 (0)