diff --git a/lib/plsql/procedure.rb b/lib/plsql/procedure.rb index f17be90a..25236375 100644 --- a/lib/plsql/procedure.rb +++ b/lib/plsql/procedure.rb @@ -100,11 +100,13 @@ def get_argument_metadata #:nodoc: # subprogram_id column is available just from version 10g subprogram_id_column = (@schema.connection.database_version <=> [10, 2, 0, 2]) >= 0 ? 'subprogram_id' : 'NULL' + # defaulted is available just from version 11g + defaulted_column = (@schema.connection.database_version <=> [11, 0, 0, 0]) >= 0 ? 'defaulted' : 'NULL' @schema.select_all( "SELECT #{subprogram_id_column}, object_name, TO_NUMBER(overload), argument_name, position, data_level, data_type, in_out, data_length, data_precision, data_scale, char_used, - char_length, type_owner, type_name, type_subname + char_length, type_owner, type_name, type_subname, #{defaulted_column} FROM all_arguments WHERE object_id = :object_id AND owner = :owner @@ -115,7 +117,7 @@ def get_argument_metadata #:nodoc: subprogram_id, object_name, overload, argument_name, position, data_level, data_type, in_out, data_length, data_precision, data_scale, char_used, - char_length, type_owner, type_name, type_subname = r + char_length, type_owner, type_name, type_subname, defaulted = r @overloaded ||= !overload.nil? # if not overloaded then store arguments at key 0 @@ -155,7 +157,8 @@ def get_argument_metadata #:nodoc: :type_owner => type_owner, :type_name => type_name, :type_subname => type_subname, - :sql_type_name => sql_type_name + :sql_type_name => sql_type_name, + :defaulted => defaulted } if tmp_table_name @tmp_table_names[overload] << [(argument_metadata[:tmp_table_name] = tmp_table_name), argument_metadata] diff --git a/spec/plsql/procedure_spec.rb b/spec/plsql/procedure_spec.rb index 12c8c1e3..9a71652e 100644 --- a/spec/plsql/procedure_spec.rb +++ b/spec/plsql/procedure_spec.rb @@ -2251,3 +2251,49 @@ def new_candidate(status) end end + +describe '#get_argument_metadata' do + before(:each) do + plsql.execute <<-SQL + CREATE OR REPLACE FUNCTION magic_number(p_num INTEGER #{defaulted_clause}) + RETURN INTEGER + IS + BEGIN + RETURN p_num * 2; + END magic_number; + SQL + end + + after(:each) do + plsql.execute "DROP FUNCTION magic_number" + end + + context 'on procedure with defaulted field' do + let(:defaulted_clause) { 'DEFAULT 21' } + + it 'field\'s metadata attribute "defaulted" is Y' do + procedure = PLSQL::Procedure.find(plsql, :magic_number) + expect(procedure.arguments[0][:p_num][:defaulted]).to eq('Y') + end + end + + context 'procedure without defaulted field' do + let(:defaulted_clause) { '' } + + it 'field\'s metadata attribute "defaulted" is N' do + procedure = PLSQL::Procedure.find(plsql, :magic_number) + expect(procedure.arguments[0][:p_num][:defaulted]).to eq('N') + end + end + + context 'oracle <= 10g without defaulted functionality' do + let(:defaulted_clause) { '' } + + it 'field\'s metadata attribute "defaulted" is nil' do + allow(plsql.connection).to receive(:database_version).and_return([10, 2, 0, 2]) + + procedure = PLSQL::Procedure.find(plsql, :magic_number) + expect(procedure.arguments[0][:p_num][:defaulted]).to be_nil + end + end +end