Skip to content

Commit 7c6c0d2

Browse files
authored
Merge pull request #254 from yahonda/fix-cross-schema-type-owner
Use type_owner for cross-schema type lookups
2 parents c3fa632 + 8848b0b commit 7c6c0d2

3 files changed

Lines changed: 52 additions & 4 deletions

File tree

lib/plsql/procedure.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@ def get_field_definitions(argument_metadata) # :nodoc:
361361
WHERE t.OWNER = :owner AND t.type_name = :type_name AND t.package_name = :package_name
362362
AND ta.OWNER = t.owner AND ta.TYPE_NAME = t.TYPE_NAME AND ta.PACKAGE_NAME = t.PACKAGE_NAME
363363
ORDER BY attr_no",
364-
@schema_name, argument_metadata[:type_name], argument_metadata[:type_subname]) do |r|
364+
argument_metadata[:type_owner], argument_metadata[:type_name], argument_metadata[:type_subname]) do |r|
365365

366366
attr_no, attr_name, attr_type_owner, attr_type_name, attr_type_package, attr_length, attr_precision, attr_scale, attr_char_used = r
367367

@@ -393,7 +393,7 @@ def get_field_definitions(argument_metadata) # :nodoc:
393393
"SELECT column_id, column_name, data_type, data_length, data_precision, data_scale, char_length, char_used
394394
FROM ALL_TAB_COLUMNS WHERE OWNER = :owner AND TABLE_NAME = :type_name
395395
ORDER BY column_id",
396-
@schema_name, argument_metadata[:type_name]) do |r|
396+
argument_metadata[:type_owner], argument_metadata[:type_name]) do |r|
397397

398398
col_no, col_name, col_type_name, col_length, col_precision, col_scale, col_char_length, col_char_used = r
399399

@@ -429,7 +429,7 @@ def get_element_definition(argument_metadata) # :nodoc:
429429
"SELECT elem_type_owner, elem_type_name, elem_type_package, length, precision, scale, char_used, index_by
430430
FROM ALL_PLSQL_COLL_TYPES t
431431
WHERE t.OWNER = :owner AND t.TYPE_NAME = :type_name AND t.PACKAGE_NAME = :package_name",
432-
@schema_name, argument_metadata[:type_name], argument_metadata[:type_subname])
432+
argument_metadata[:type_owner], argument_metadata[:type_name], argument_metadata[:type_subname])
433433

434434
elem_type_owner, elem_type_name, elem_type_package, elem_length, elem_precision, elem_scale, elem_char_used, index_by = r
435435

@@ -486,7 +486,7 @@ def get_element_definition(argument_metadata) # :nodoc:
486486
"SELECT elem_type_owner, elem_type_name, length, precision, scale, char_used
487487
FROM ALL_COLL_TYPES t
488488
WHERE t.owner = :owner AND t.TYPE_NAME = :type_name",
489-
@schema_name, argument_metadata[:type_name]
489+
argument_metadata[:type_owner], argument_metadata[:type_name]
490490
)
491491
elem_type_owner, elem_type_name, elem_length, elem_precision, elem_scale, elem_char_used = r
492492

spec/plsql/procedure_spec.rb

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2530,3 +2530,48 @@ def new_candidate(status)
25302530
expect(result).to eq(1)
25312531
end
25322532
end
2533+
2534+
describe "Function with cross-schema type reference" do
2535+
before(:all) do
2536+
primary_user, _ = DATABASE_USERS_AND_PASSWORDS[0]
2537+
second_user, second_password = DATABASE_USERS_AND_PASSWORDS[1]
2538+
@second_schema = second_user.upcase
2539+
2540+
plsql.connect! CONNECTION_PARAMS
2541+
2542+
# Connect as second user to create type and grant execute to primary user
2543+
plsql2 = PLSQL::Schema.new
2544+
plsql2.connect! CONNECTION_PARAMS.merge(username: second_user, password: second_password)
2545+
plsql2.execute "CREATE OR REPLACE TYPE t_cross_schema_record AS OBJECT (id NUMBER, name VARCHAR2(50))"
2546+
plsql2.execute "GRANT EXECUTE ON t_cross_schema_record TO #{primary_user}"
2547+
plsql2.logoff
2548+
2549+
plsql.execute <<-SQL
2550+
CREATE OR REPLACE FUNCTION test_cross_schema_fn(p_rec #{@second_schema}.t_cross_schema_record)
2551+
RETURN NUMBER
2552+
IS
2553+
BEGIN
2554+
RETURN p_rec.id;
2555+
END;
2556+
SQL
2557+
end
2558+
2559+
after(:all) do
2560+
second_user, second_password = DATABASE_USERS_AND_PASSWORDS[1]
2561+
plsql.execute "DROP FUNCTION test_cross_schema_fn" rescue nil
2562+
plsql2 = PLSQL::Schema.new
2563+
plsql2.connect! CONNECTION_PARAMS.merge(username: second_user, password: second_password)
2564+
plsql2.execute "DROP TYPE t_cross_schema_record" rescue nil
2565+
plsql2.logoff
2566+
plsql.logoff
2567+
end
2568+
2569+
it "should resolve type from another schema" do
2570+
expect(PLSQL::Procedure.find(plsql, :test_cross_schema_fn)).not_to be_nil
2571+
end
2572+
2573+
it "should execute function with cross-schema type parameter" do
2574+
result = plsql.test_cross_schema_fn(id: 42, name: "test")
2575+
expect(result).to eq(42)
2576+
end
2577+
end
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
11
create user arunit identified by arunit;
22
grant create session to arunit;
3+
grant create type to arunit;
4+
grant create procedure to arunit;
5+
grant unlimited tablespace to arunit;

0 commit comments

Comments
 (0)