From 0bcd5b06649f088057bae76e61b73e3b9644df2e Mon Sep 17 00:00:00 2001 From: Tanzeel Khan Date: Wed, 5 Feb 2025 14:01:15 +0000 Subject: [PATCH] Add first batch of tests Signed-off-by: Tanzeel Khan --- contrib/babelfishpg_tsql/src/iterative_exec.c | 2 +- ...JECT_RESOLUTION_IN_ROUTINES-vu-cleanup.out | 36 + ...JECT_RESOLUTION_IN_ROUTINES-vu-prepare.out | 283 +++++++ ...BJECT_RESOLUTION_IN_ROUTINES-vu-verify.out | 748 ++++++++++++++++++ test/JDBC/expected/sp_proc.out | 89 +++ ...JECT_RESOLUTION_IN_ROUTINES-vu-cleanup.mix | 36 + ...JECT_RESOLUTION_IN_ROUTINES-vu-prepare.mix | 271 +++++++ ...BJECT_RESOLUTION_IN_ROUTINES-vu-verify.mix | 186 +++++ test/JDBC/input/sp_proc.sql | 43 + 9 files changed, 1693 insertions(+), 1 deletion(-) create mode 100644 test/JDBC/expected/BABEL_OBJECT_RESOLUTION_IN_ROUTINES-vu-cleanup.out create mode 100644 test/JDBC/expected/BABEL_OBJECT_RESOLUTION_IN_ROUTINES-vu-prepare.out create mode 100644 test/JDBC/expected/BABEL_OBJECT_RESOLUTION_IN_ROUTINES-vu-verify.out create mode 100644 test/JDBC/input/object_resolution/BABEL_OBJECT_RESOLUTION_IN_ROUTINES-vu-cleanup.mix create mode 100644 test/JDBC/input/object_resolution/BABEL_OBJECT_RESOLUTION_IN_ROUTINES-vu-prepare.mix create mode 100644 test/JDBC/input/object_resolution/BABEL_OBJECT_RESOLUTION_IN_ROUTINES-vu-verify.mix diff --git a/contrib/babelfishpg_tsql/src/iterative_exec.c b/contrib/babelfishpg_tsql/src/iterative_exec.c index d05d7e27db7..60f3ec0dd4c 100644 --- a/contrib/babelfishpg_tsql/src/iterative_exec.c +++ b/contrib/babelfishpg_tsql/src/iterative_exec.c @@ -2225,7 +2225,7 @@ set_search_path_for_pltsql_stmt(PLtsql_stmt *stmt) pfree(physical_schema); pfree(dbo_schema); } - else if (execsqlstmt->is_ddl && current_db_search_path) + else if (execsqlstmt->is_ddl) { new_search_path = pstrdup(current_db_search_path); } diff --git a/test/JDBC/expected/BABEL_OBJECT_RESOLUTION_IN_ROUTINES-vu-cleanup.out b/test/JDBC/expected/BABEL_OBJECT_RESOLUTION_IN_ROUTINES-vu-cleanup.out new file mode 100644 index 00000000000..9793eb654ac --- /dev/null +++ b/test/JDBC/expected/BABEL_OBJECT_RESOLUTION_IN_ROUTINES-vu-cleanup.out @@ -0,0 +1,36 @@ +-- tsql +DROP DATABASE babel_5448_db +GO + +DROP PROC dbo.babel_5448_p, dbo.babel_5448_p1 +GO +DROP PROC babel_5448_user_default_schema.babel_5448_p, babel_5448_user_default_schema.babel_5448_p1 +GO +DROP PROC babel_5448_s1.babel_5448_p, babel_5448_s1.babel_5448_p1 +GO + +DROP FUNCTION dbo.babel_5448_f +GO +DROP FUNCTION babel_5448_user_default_schema.babel_5448_f +GO +DROP FUNCTION babel_5448_s1.babel_5448_f +GO + +DROP TABLE dbo.babel_5448_t +GO +DROP TABLE babel_5448_user_default_schema.babel_5448_t +GO +DROP TABLE babel_5448_s1.babel_5448_t +GO + +DROP VIEW dbo.babel_5448_v +GO +DROP VIEW babel_5448_user_default_schema.babel_5448_v +GO +DROP VIEW babel_5448_s1.babel_5448_v +GO + +DROP SCHEMA babel_5448_user_default_schema +GO +DROP SCHEMA babel_5448_s1 +GO diff --git a/test/JDBC/expected/BABEL_OBJECT_RESOLUTION_IN_ROUTINES-vu-prepare.out b/test/JDBC/expected/BABEL_OBJECT_RESOLUTION_IN_ROUTINES-vu-prepare.out new file mode 100644 index 00000000000..24a436a442a --- /dev/null +++ b/test/JDBC/expected/BABEL_OBJECT_RESOLUTION_IN_ROUTINES-vu-prepare.out @@ -0,0 +1,283 @@ + + + + + + + + + +-- tsql +-- In this test file we will test babelfish object resolution inside procedure functions and triggers +-- At high level there are four cases to tests +-- 1. CROSS DB routine calls +-- 2. Same DB routine calls +-- 3. CROSS DB non default user schema +-- 4. Same DB non default user schema +-- Then each case will be tested against subcases like +-- 1. DMLs +-- 2. DDLs +-- 3. Cross databases objects references +-- 4. EXEC procedure call statements +-- 5. Other tsql statements +-- Each tests will need to be repeated thrice since search path will have two schemas and on the third attemp we should get object does not exists errors +-- 1. Object exists in the first schema +-- 2. Object does not exists in the first schema but does exists in second schema +-- 3. We should error out now, if object is not a schema sys object and not schema qualified +-- Another important case to test is scope handling +-- This means that search path and current logical database value should be set and reset correctly +-- and we do not leak any of these values in any case +-- For example a search path which was set inside the procedure should not be used for queries after the procedure has ended +-- So we need tests cases like EXEC s1.p; SELECT * FROM t; and check if t is resolved correctly. +/***************************************/ +/*************** SAME DB ***************/ +/***************************************/ +/******** SETUP ********/ +-- We will work with 3 schemas "dbo" & +USE master +GO +CREATE SCHEMA babel_5448_user_default_schema +GO +CREATE SCHEMA babel_5448_s1 +GO + +-- Now create objects in all three schemas +CREATE TABLE dbo.babel_5448_t (id NVARCHAR(max)) +GO +CREATE TABLE babel_5448_user_default_schema.babel_5448_t (id NVARCHAR(max)) +GO +CREATE TABLE babel_5448_s1.babel_5448_t (id NVARCHAR(max)) +GO + +INSERT INTO dbo.babel_5448_t VALUES ('master.dbo') +INSERT INTO babel_5448_user_default_schema.babel_5448_t VALUES ('master.babel_5448_user_default_schema') +INSERT INTO babel_5448_s1.babel_5448_t VALUES ('master.babel_5448_s1') +GO +~~ROW COUNT: 1~~ + +~~ROW COUNT: 1~~ + +~~ROW COUNT: 1~~ + + +CREATE PROCEDURE dbo.babel_5448_p AS SELECT 'master.dbo' AS col1 +GO +CREATE PROCEDURE babel_5448_user_default_schema.babel_5448_p AS SELECT 'master.babel_5448_user_default_schema' AS col1 +GO +CREATE PROCEDURE babel_5448_s1.babel_5448_p AS SELECT 'master.babel_5448_s1' AS col1 +GO + +CREATE FUNCTION dbo.babel_5448_f() RETURNS NVARCHAR(MAX) +AS +BEGIN + RETURN 'master.dbo'; +END +GO + +CREATE FUNCTION babel_5448_user_default_schema.babel_5448_f() RETURNS NVARCHAR(MAX) +AS +BEGIN + RETURN 'master.babel_5448_user_default_schema'; +END +GO + +CREATE FUNCTION babel_5448_s1.babel_5448_f() RETURNS NVARCHAR(MAX) +AS +BEGIN + RETURN 'master.babel_5448_s1'; +END +GO + +CREATE VIEW dbo.babel_5448_v AS SELECT 'master.dbo' AS col1 +GO +CREATE VIEW babel_5448_user_default_schema.babel_5448_v AS SELECT 'master.babel_5448_user_default_schema' AS col1 +GO +CREATE VIEW babel_5448_s1.babel_5448_v AS SELECT 'master.babel_5448_s1' AS col1 +GO + +CREATE TRIGGER dbo.babel_5448_trigger +ON dbo.babel_5448_t +AFTER INSERT AS + SELECT '=========== START OF TRIGGER EXECUTION ========== master.dbo' + SELECT dbo.babel_5448_f(); + SELECT * FROM babel_5448_t; + SELECT '=========== END OF TRIGGER EXECUTION ========== master.dbo' +GO + +CREATE TRIGGER babel_5448_user_default_schema.babel_5448_trigger +ON babel_5448_user_default_schema.babel_5448_t +AFTER INSERT AS + SELECT '=========== START OF TRIGGER EXECUTION ========== master.babel_5448_user_default_schema' + SELECT babel_5448_user_default_schema.babel_5448_f(); + SELECT * FROM babel_5448_t; + SELECT '=========== END OF TRIGGER EXECUTION ========== master.babel_5448_user_default_schema' +GO + +CREATE TRIGGER babel_5448_s1.babel_5448_trigger +ON babel_5448_s1.babel_5448_t +AFTER INSERT AS + SELECT '=========== START OF TRIGGER EXECUTION ========== master.babel_5448_s1' + SELECT babel_5448_s1.babel_5448_f(); + SELECT * FROM babel_5448_t; + SELECT '=========== END OF TRIGGER EXECUTION ========== master.babel_5448_s1' +GO + +CREATE PROCEDURE dbo.babel_5448_p1 +AS + SELECT babel_5448_f(), * FROM babel_5448_t; + -- EXEC call should still resolve to dbo.babel_5448_p + EXEC babel_5448_p; + INSERT INTO babel_5448_t VALUES ('temp inserted row to check DML and trigger executiong'); + DELETE FROM babel_5448_t WHERE length(id) > 50; + -- CHECK IF ROW WAS DELETED FROM THE RIGHT TABLE + SELECT * FROM babel_5448_t; +GO + +CREATE PROCEDURE babel_5448_user_default_schema.babel_5448_p1 +AS + SELECT babel_5448_f(), * FROM babel_5448_t; + -- EXEC call should still resolve to dbo.babel_5448_p + EXEC babel_5448_p; + INSERT INTO babel_5448_t VALUES ('temp inserted row to check DML and trigger executiong'); + DELETE FROM babel_5448_t WHERE length(id) > 50; + -- CHECK IF ROW WAS DELETED FROM THE RIGHT TABLE + SELECT * FROM babel_5448_t; +GO + +CREATE PROCEDURE babel_5448_s1.babel_5448_p1 +AS + SELECT babel_5448_f(), * FROM babel_5448_t; + -- EXEC call should still resolve to dbo.babel_5448_p + EXEC babel_5448_p; + INSERT INTO babel_5448_t VALUES ('temp inserted row to check DML and trigger executiong'); + DELETE FROM babel_5448_t WHERE length(id) > 50; + -- CHECK IF ROW WAS DELETED FROM THE RIGHT TABLE + SELECT * FROM babel_5448_t; +GO + + +/***************************************/ +/************** CROSS DB ***************/ +/***************************************/ +CREATE DATABASE babel_5448_db +GO +USE babel_5448_db +GO +CREATE SCHEMA babel_5448_user_default_schema +GO +CREATE SCHEMA babel_5448_s1 +GO + +-- Now create objects in all three schemas +CREATE TABLE dbo.babel_5448_t (id NVARCHAR(max)) +GO +CREATE TABLE babel_5448_user_default_schema.babel_5448_t (id NVARCHAR(max)) +GO +CREATE TABLE babel_5448_s1.babel_5448_t (id NVARCHAR(max)) +GO + +INSERT INTO dbo.babel_5448_t VALUES ('babel_5448_db.dbo') +INSERT INTO babel_5448_user_default_schema.babel_5448_t VALUES ('babel_5448_db.babel_5448_user_default_schema') +INSERT INTO babel_5448_s1.babel_5448_t VALUES ('babel_5448_db.babel_5448_s1') +GO +~~ROW COUNT: 1~~ + +~~ROW COUNT: 1~~ + +~~ROW COUNT: 1~~ + + +CREATE PROCEDURE dbo.babel_5448_p AS SELECT 'babel_5448_db.dbo' AS col1 +GO +CREATE PROCEDURE babel_5448_user_default_schema.babel_5448_p AS SELECT 'babel_5448_db.babel_5448_user_default_schema' AS col1 +GO +CREATE PROCEDURE babel_5448_s1.babel_5448_p AS SELECT 'babel_5448_db.babel_5448_s1' AS col1 +GO + +CREATE FUNCTION dbo.babel_5448_f() RETURNS NVARCHAR(MAX) +AS +BEGIN + RETURN 'babel_5448_db.dbo'; +END +GO + +CREATE FUNCTION babel_5448_user_default_schema.babel_5448_f() RETURNS NVARCHAR(MAX) +AS +BEGIN + RETURN 'babel_5448_db.babel_5448_user_default_schema'; +END +GO + +CREATE FUNCTION babel_5448_s1.babel_5448_f() RETURNS NVARCHAR(MAX) +AS +BEGIN + RETURN 'babel_5448_db.babel_5448_s1'; +END +GO + +CREATE VIEW dbo.babel_5448_v AS SELECT 'babel_5448_db.dbo' AS col1 +GO +CREATE VIEW babel_5448_user_default_schema.babel_5448_v AS SELECT 'babel_5448_db.babel_5448_user_default_schema' AS col1 +GO +CREATE VIEW babel_5448_s1.babel_5448_v AS SELECT 'babel_5448_db.babel_5448_s1' AS col1 +GO + +CREATE TRIGGER dbo.babel_5448_trigger +ON dbo.babel_5448_t +AFTER INSERT AS + SELECT '=========== START OF TRIGGER EXECUTION ========== babel_5448_db.dbo' + SELECT dbo.babel_5448_f(); + SELECT * FROM babel_5448_t; + SELECT '=========== END OF TRIGGER EXECUTION ========== babel_5448_db.dbo' +GO + +CREATE TRIGGER babel_5448_user_default_schema.babel_5448_trigger +ON babel_5448_user_default_schema.babel_5448_t +AFTER INSERT AS + SELECT '=========== START OF TRIGGER EXECUTION ========== babel_5448_db.babel_5448_user_default_schema' + SELECT babel_5448_user_default_schema.babel_5448_f(); + SELECT * FROM babel_5448_t; + SELECT '=========== END OF TRIGGER EXECUTION ========== babel_5448_db.babel_5448_user_default_schema' +GO + +CREATE TRIGGER babel_5448_s1.babel_5448_trigger +ON babel_5448_s1.babel_5448_t +AFTER INSERT AS + SELECT '=========== START OF TRIGGER EXECUTION ========== babel_5448_db.babel_5448_s1' + SELECT babel_5448_s1.babel_5448_f(); + SELECT * FROM babel_5448_t; + SELECT '=========== END OF TRIGGER EXECUTION ========== babel_5448_db.babel_5448_s1' +GO + +CREATE PROCEDURE dbo.babel_5448_p1 +AS + SELECT babel_5448_f(), * FROM babel_5448_t; + -- EXEC call should still resolve to dbo.babel_5448_p + EXEC babel_5448_p; + INSERT INTO babel_5448_t VALUES ('temp inserted row to check DML and trigger executiong'); + DELETE FROM babel_5448_t WHERE length(id) > 50; + -- CHECK IF ROW WAS DELETED FROM THE RIGHT TABLE + SELECT * FROM babel_5448_t; +GO + +CREATE PROCEDURE babel_5448_user_default_schema.babel_5448_p1 +AS + SELECT babel_5448_f(), * FROM babel_5448_t; + -- EXEC call should still resolve to dbo.babel_5448_p + EXEC babel_5448_p; + INSERT INTO babel_5448_t VALUES ('temp inserted row to check DML and trigger executiong'); + DELETE FROM babel_5448_t WHERE length(id) > 50; + -- CHECK IF ROW WAS DELETED FROM THE RIGHT TABLE + SELECT * FROM babel_5448_t; +GO + +CREATE PROCEDURE babel_5448_s1.babel_5448_p1 +AS + SELECT babel_5448_f(), * FROM babel_5448_t; + -- EXEC call should still resolve to dbo.babel_5448_p + EXEC babel_5448_p; + INSERT INTO babel_5448_t VALUES ('temp inserted row to check DML and trigger executiong'); + DELETE FROM babel_5448_t WHERE length(id) > 50; + -- CHECK IF ROW WAS DELETED FROM THE RIGHT TABLE + SELECT * FROM babel_5448_t; +GO diff --git a/test/JDBC/expected/BABEL_OBJECT_RESOLUTION_IN_ROUTINES-vu-verify.out b/test/JDBC/expected/BABEL_OBJECT_RESOLUTION_IN_ROUTINES-vu-verify.out new file mode 100644 index 00000000000..c7d00cd0c2f --- /dev/null +++ b/test/JDBC/expected/BABEL_OBJECT_RESOLUTION_IN_ROUTINES-vu-verify.out @@ -0,0 +1,748 @@ + +-- tsql + + +-- All tests will be triggered from babel_5448_db database +-- For cross database, we will use master database +/*********************************/ +/*********** SAME DB ************/ +/*********************************/ +USE babel_5448_db +GO + +-- All objects should resolve to babel_5448_db.dbo schema in this call +EXEC dbo.babel_5448_p1 +GO +~~START~~ +nvarchar#!#nvarchar +babel_5448_db.dbo#!#babel_5448_db.dbo +~~END~~ + +~~START~~ +varchar +babel_5448_db.dbo +~~END~~ + +~~START~~ +varchar +=========== START OF TRIGGER EXECUTION ========== babel_5448_db.dbo +~~END~~ + +~~START~~ +nvarchar +babel_5448_db.dbo +~~END~~ + +~~START~~ +nvarchar +babel_5448_db.dbo +temp inserted row to check DML and trigger executiong +~~END~~ + +~~START~~ +varchar +=========== END OF TRIGGER EXECUTION ========== babel_5448_db.dbo +~~END~~ + +~~ROW COUNT: 1~~ + +~~ROW COUNT: 1~~ + +~~START~~ +nvarchar +babel_5448_db.dbo +~~END~~ + + +-- All objects should resolve to babel_5448_db.babel_5448_user_default_schema schema in this call +-- except EXEC call stmt +EXEC babel_5448_user_default_schema.babel_5448_p1 +GO +~~START~~ +nvarchar#!#nvarchar +babel_5448_db.babel_5448_user_default_schema#!#babel_5448_db.babel_5448_user_default_schema +~~END~~ + +~~START~~ +varchar +babel_5448_db.dbo +~~END~~ + +~~START~~ +varchar +=========== START OF TRIGGER EXECUTION ========== babel_5448_db.babel_5448_user_default_schema +~~END~~ + +~~START~~ +nvarchar +babel_5448_db.babel_5448_user_default_schema +~~END~~ + +~~START~~ +nvarchar +babel_5448_db.babel_5448_user_default_schema +temp inserted row to check DML and trigger executiong +~~END~~ + +~~START~~ +varchar +=========== END OF TRIGGER EXECUTION ========== babel_5448_db.babel_5448_user_default_schema +~~END~~ + +~~ROW COUNT: 1~~ + +~~ROW COUNT: 1~~ + +~~START~~ +nvarchar +babel_5448_db.babel_5448_user_default_schema +~~END~~ + + +-- All objects should resolve to babel_5448_db.babel_5448_s1 schema in this call +-- except EXEC call stmt +EXEC babel_5448_s1.babel_5448_p1 +GO +~~START~~ +nvarchar#!#nvarchar +babel_5448_db.babel_5448_s1#!#babel_5448_db.babel_5448_s1 +~~END~~ + +~~START~~ +varchar +babel_5448_db.dbo +~~END~~ + +~~START~~ +varchar +=========== START OF TRIGGER EXECUTION ========== babel_5448_db.babel_5448_s1 +~~END~~ + +~~START~~ +nvarchar +babel_5448_db.babel_5448_s1 +~~END~~ + +~~START~~ +nvarchar +babel_5448_db.babel_5448_s1 +temp inserted row to check DML and trigger executiong +~~END~~ + +~~START~~ +varchar +=========== END OF TRIGGER EXECUTION ========== babel_5448_db.babel_5448_s1 +~~END~~ + +~~ROW COUNT: 1~~ + +~~ROW COUNT: 1~~ + +~~START~~ +nvarchar +babel_5448_db.babel_5448_s1 +~~END~~ + + + +-- Now we will run the same procedures again but this time we will references objects from other schema +-- proc in dbo will reference objects from babel_5448_user_default_schema schema +-- proc in babel_5448_user_default_schema will reference objects from babel_5448_s1 schema +-- proc in babel_5448_s1 will reference objects from dbo schema +ALTER PROCEDURE dbo.babel_5448_p1 +AS + SELECT babel_5448_user_default_schema.babel_5448_f(), * FROM babel_5448_user_default_schema.babel_5448_t; + EXEC babel_5448_user_default_schema.babel_5448_p; + INSERT INTO babel_5448_user_default_schema.babel_5448_t VALUES ('temp inserted row to check DML and trigger executiong'); + DELETE FROM babel_5448_t WHERE length(id) > 50; + -- CHECK IF ROW WAS DELETED FROM THE RIGHT TABLE + SELECT * FROM babel_5448_user_default_schema.babel_5448_t; +GO + +ALTER PROCEDURE babel_5448_user_default_schema.babel_5448_p1 +AS + SELECT babel_5448_s1.babel_5448_f(), * FROM babel_5448_s1.babel_5448_t; + EXEC babel_5448_s1.babel_5448_p; + INSERT INTO babel_5448_s1.babel_5448_t VALUES ('temp inserted row to check DML and trigger executiong'); + DELETE FROM babel_5448_t WHERE length(id) > 50; + -- CHECK IF ROW WAS DELETED FROM THE RIGHT TABLE + SELECT babel_5448_s1.babel_5448_f(), * FROM babel_5448_s1.babel_5448_t; +GO + +ALTER PROCEDURE babel_5448_s1.babel_5448_p1 +AS + SELECT dbo.babel_5448_f(), * FROM dbo.babel_5448_t; + EXEC dbo.babel_5448_p; + INSERT INTO dbo.babel_5448_t VALUES ('temp inserted row to check DML and trigger executiong'); + DELETE FROM dbo.babel_5448_t WHERE length(id) > 50; + -- CHECK IF ROW WAS DELETED FROM THE RIGHT TABLE + SELECT * FROM dbo.babel_5448_t; +GO + +-- All objects should resolve to babel_5448_db.babel_5448_user_default_schema schema in this call +EXEC dbo.babel_5448_p1 +GO +~~START~~ +nvarchar#!#nvarchar +babel_5448_db.babel_5448_user_default_schema#!#babel_5448_db.babel_5448_user_default_schema +~~END~~ + +~~START~~ +varchar +babel_5448_db.babel_5448_user_default_schema +~~END~~ + +~~START~~ +varchar +=========== START OF TRIGGER EXECUTION ========== babel_5448_db.babel_5448_user_default_schema +~~END~~ + +~~START~~ +nvarchar +babel_5448_db.babel_5448_user_default_schema +~~END~~ + +~~START~~ +nvarchar +babel_5448_db.babel_5448_user_default_schema +temp inserted row to check DML and trigger executiong +~~END~~ + +~~START~~ +varchar +=========== END OF TRIGGER EXECUTION ========== babel_5448_db.babel_5448_user_default_schema +~~END~~ + +~~ROW COUNT: 1~~ + +~~START~~ +nvarchar +babel_5448_db.babel_5448_user_default_schema +temp inserted row to check DML and trigger executiong +~~END~~ + + +-- All objects should resolve to babel_5448_db.babel_5448_s1 schema in this call +EXEC babel_5448_user_default_schema.babel_5448_p1 +GO +~~START~~ +nvarchar#!#nvarchar +babel_5448_db.babel_5448_s1#!#babel_5448_db.babel_5448_s1 +~~END~~ + +~~START~~ +varchar +babel_5448_db.babel_5448_s1 +~~END~~ + +~~START~~ +varchar +=========== START OF TRIGGER EXECUTION ========== babel_5448_db.babel_5448_s1 +~~END~~ + +~~START~~ +nvarchar +babel_5448_db.babel_5448_s1 +~~END~~ + +~~START~~ +nvarchar +babel_5448_db.babel_5448_s1 +temp inserted row to check DML and trigger executiong +~~END~~ + +~~START~~ +varchar +=========== END OF TRIGGER EXECUTION ========== babel_5448_db.babel_5448_s1 +~~END~~ + +~~ROW COUNT: 1~~ + +~~ROW COUNT: 1~~ + +~~START~~ +nvarchar#!#nvarchar +babel_5448_db.babel_5448_s1#!#babel_5448_db.babel_5448_s1 +babel_5448_db.babel_5448_s1#!#temp inserted row to check DML and trigger executiong +~~END~~ + + +-- All objects should resolve to babel_5448_db.dbo schema in this call +EXEC babel_5448_s1.babel_5448_p1 +GO +~~START~~ +nvarchar#!#nvarchar +babel_5448_db.dbo#!#babel_5448_db.dbo +~~END~~ + +~~START~~ +varchar +babel_5448_db.dbo +~~END~~ + +~~START~~ +varchar +=========== START OF TRIGGER EXECUTION ========== babel_5448_db.dbo +~~END~~ + +~~START~~ +nvarchar +babel_5448_db.dbo +~~END~~ + +~~START~~ +nvarchar +babel_5448_db.dbo +temp inserted row to check DML and trigger executiong +~~END~~ + +~~START~~ +varchar +=========== END OF TRIGGER EXECUTION ========== babel_5448_db.dbo +~~END~~ + +~~ROW COUNT: 1~~ + +~~ROW COUNT: 1~~ + +~~START~~ +nvarchar +babel_5448_db.dbo +~~END~~ + + +-- testing different schemas +-- procedure and function will be on same schema but +-- table & trigger will be different schema +-- basically testing row level search path changes +ALTER PROCEDURE dbo.babel_5448_p1 +AS + INSERT INTO babel_5448_user_default_schema.babel_5448_t SELECT babel_5448_f() FROM generate_series(1,3); + -- trigger execution will tells use what the function resolved to + -- and what the objects inside triggers resolved to + DELETE FROM babel_5448_user_default_schema.babel_5448_t WHERE id != 'babel_5448_db.babel_5448_user_default_schema' +GO + +ALTER PROCEDURE babel_5448_user_default_schema.babel_5448_p1 +AS + INSERT INTO babel_5448_s1.babel_5448_t SELECT babel_5448_f() FROM generate_series(1,3); + -- trigger execution will tells use what the function resolved to + -- and what the objects inside triggers resolved to + DELETE FROM babel_5448_s1.babel_5448_t WHERE id != 'babel_5448_db.babel_5448_s1' +GO + +ALTER PROCEDURE babel_5448_s1.babel_5448_p1 +AS + INSERT INTO dbo.babel_5448_t SELECT babel_5448_f() FROM generate_series(1,3); + -- trigger execution will tells use what the function resolved to + -- and what the objects inside triggers resolved to + DELETE FROM dbo.babel_5448_t WHERE id != 'babel_5448_db.dbo' +GO + + +EXEC dbo.babel_5448_p1 +GO +~~START~~ +varchar +=========== START OF TRIGGER EXECUTION ========== babel_5448_db.babel_5448_user_default_schema +~~END~~ + +~~START~~ +nvarchar +babel_5448_db.babel_5448_user_default_schema +~~END~~ + +~~START~~ +nvarchar +babel_5448_db.babel_5448_user_default_schema +babel_5448_db.dbo +babel_5448_db.dbo +babel_5448_db.dbo +~~END~~ + +~~START~~ +varchar +=========== END OF TRIGGER EXECUTION ========== babel_5448_db.babel_5448_user_default_schema +~~END~~ + +~~ROW COUNT: 3~~ + +~~ROW COUNT: 3~~ + + + +EXEC babel_5448_user_default_schema.babel_5448_p1 +GO +~~START~~ +varchar +=========== START OF TRIGGER EXECUTION ========== babel_5448_db.babel_5448_s1 +~~END~~ + +~~START~~ +nvarchar +babel_5448_db.babel_5448_s1 +~~END~~ + +~~START~~ +nvarchar +babel_5448_db.babel_5448_s1 +temp inserted row to check DML and trigger executiong +babel_5448_db.babel_5448_user_default_schema +babel_5448_db.babel_5448_user_default_schema +babel_5448_db.babel_5448_user_default_schema +~~END~~ + +~~START~~ +varchar +=========== END OF TRIGGER EXECUTION ========== babel_5448_db.babel_5448_s1 +~~END~~ + +~~ROW COUNT: 3~~ + +~~ROW COUNT: 4~~ + + + +EXEC babel_5448_s1.babel_5448_p1 +GO +~~START~~ +varchar +=========== START OF TRIGGER EXECUTION ========== babel_5448_db.dbo +~~END~~ + +~~START~~ +nvarchar +babel_5448_db.dbo +~~END~~ + +~~START~~ +nvarchar +babel_5448_db.dbo +babel_5448_db.babel_5448_s1 +babel_5448_db.babel_5448_s1 +babel_5448_db.babel_5448_s1 +~~END~~ + +~~START~~ +varchar +=========== END OF TRIGGER EXECUTION ========== babel_5448_db.dbo +~~END~~ + +~~ROW COUNT: 3~~ + +~~ROW COUNT: 3~~ + + + + +/*********************************/ +/*********** CROSS DB ************/ +/*********************************/ +USE babel_5448_db +GO + +-- All objects should resolve to master.dbo schema in this call +EXEC master.dbo.babel_5448_p1 +GO +~~START~~ +nvarchar#!#nvarchar +master.dbo#!#master.dbo +~~END~~ + +~~START~~ +varchar +master.dbo +~~END~~ + +~~START~~ +varchar +=========== START OF TRIGGER EXECUTION ========== master.dbo +~~END~~ + +~~START~~ +nvarchar +master.dbo +~~END~~ + +~~START~~ +nvarchar +master.dbo +temp inserted row to check DML and trigger executiong +~~END~~ + +~~START~~ +varchar +=========== END OF TRIGGER EXECUTION ========== master.dbo +~~END~~ + +~~ROW COUNT: 1~~ + +~~ROW COUNT: 1~~ + +~~START~~ +nvarchar +master.dbo +~~END~~ + + +-- All objects should resolve to master.babel_5448_user_default_schema schema in this call +-- except EXEC call stmt +EXEC master.babel_5448_user_default_schema.babel_5448_p1 +GO +~~START~~ +nvarchar#!#nvarchar +master.babel_5448_user_default_schema#!#master.babel_5448_user_default_schema +~~END~~ + +~~START~~ +varchar +master.dbo +~~END~~ + +~~START~~ +varchar +=========== START OF TRIGGER EXECUTION ========== master.babel_5448_user_default_schema +~~END~~ + +~~START~~ +nvarchar +master.babel_5448_user_default_schema +~~END~~ + +~~START~~ +nvarchar +master.babel_5448_user_default_schema +temp inserted row to check DML and trigger executiong +~~END~~ + +~~START~~ +varchar +=========== END OF TRIGGER EXECUTION ========== master.babel_5448_user_default_schema +~~END~~ + +~~ROW COUNT: 1~~ + +~~ROW COUNT: 1~~ + +~~START~~ +nvarchar +master.babel_5448_user_default_schema +~~END~~ + + +-- All objects should resolve to master.babel_5448_s1 schema in this call +-- except EXEC call stmt +EXEC master.babel_5448_s1.babel_5448_p1 +GO +~~START~~ +nvarchar#!#nvarchar +master.babel_5448_s1#!#master.babel_5448_s1 +~~END~~ + +~~START~~ +varchar +master.dbo +~~END~~ + +~~START~~ +varchar +=========== START OF TRIGGER EXECUTION ========== master.babel_5448_s1 +~~END~~ + +~~START~~ +nvarchar +master.babel_5448_s1 +~~END~~ + +~~START~~ +nvarchar +master.babel_5448_s1 +temp inserted row to check DML and trigger executiong +~~END~~ + +~~START~~ +varchar +=========== END OF TRIGGER EXECUTION ========== master.babel_5448_s1 +~~END~~ + +~~ROW COUNT: 1~~ + +~~ROW COUNT: 1~~ + +~~START~~ +nvarchar +master.babel_5448_s1 +~~END~~ + + +-- Now we need to alter the procedure so switch to master database +-- alter the master database procedures and then execute then from +-- babel_5448_db again +USE master +GO + +ALTER PROCEDURE dbo.babel_5448_p1 +AS + SELECT babel_5448_user_default_schema.babel_5448_f(), * FROM babel_5448_user_default_schema.babel_5448_t; + EXEC babel_5448_user_default_schema.babel_5448_p; + INSERT INTO babel_5448_user_default_schema.babel_5448_t VALUES ('temp inserted row to check DML and trigger executiong'); + DELETE FROM babel_5448_t WHERE length(id) > 50; + -- CHECK IF ROW WAS DELETED FROM THE RIGHT TABLE + SELECT * FROM babel_5448_user_default_schema.babel_5448_t; +GO + +ALTER PROCEDURE babel_5448_user_default_schema.babel_5448_p1 +AS + SELECT babel_5448_s1.babel_5448_f(), * FROM babel_5448_s1.babel_5448_t; + EXEC babel_5448_s1.babel_5448_p; + INSERT INTO babel_5448_s1.babel_5448_t VALUES ('temp inserted row to check DML and trigger executiong'); + DELETE FROM babel_5448_t WHERE length(id) > 50; + -- CHECK IF ROW WAS DELETED FROM THE RIGHT TABLE + SELECT babel_5448_s1.babel_5448_f(), * FROM babel_5448_s1.babel_5448_t; +GO + +ALTER PROCEDURE babel_5448_s1.babel_5448_p1 +AS + SELECT dbo.babel_5448_f(), * FROM dbo.babel_5448_t; + EXEC dbo.babel_5448_p; + INSERT INTO dbo.babel_5448_t VALUES ('temp inserted row to check DML and trigger executiong'); + DELETE FROM dbo.babel_5448_t WHERE length(id) > 50; + -- CHECK IF ROW WAS DELETED FROM THE RIGHT TABLE + SELECT * FROM dbo.babel_5448_t; +GO + +USE babel_5448_db +GO + +-- Now execute the altered master database procedures +-- All objects should resolve to master.babel_5448_user_default_schema schema in this call +EXEC master.dbo.babel_5448_p1 +GO +~~START~~ +nvarchar#!#nvarchar +master.babel_5448_user_default_schema#!#master.babel_5448_user_default_schema +~~END~~ + +~~START~~ +varchar +master.babel_5448_user_default_schema +~~END~~ + +~~START~~ +varchar +=========== START OF TRIGGER EXECUTION ========== master.babel_5448_user_default_schema +~~END~~ + +~~START~~ +nvarchar +master.babel_5448_user_default_schema +~~END~~ + +~~START~~ +nvarchar +master.babel_5448_user_default_schema +temp inserted row to check DML and trigger executiong +~~END~~ + +~~START~~ +varchar +=========== END OF TRIGGER EXECUTION ========== master.babel_5448_user_default_schema +~~END~~ + +~~ROW COUNT: 1~~ + +~~START~~ +nvarchar +master.babel_5448_user_default_schema +temp inserted row to check DML and trigger executiong +~~END~~ + + +-- All objects should resolve to master.babel_5448_s1 schema in this call +EXEC master.babel_5448_user_default_schema.babel_5448_p1 +GO +~~START~~ +nvarchar#!#nvarchar +master.babel_5448_s1#!#master.babel_5448_s1 +~~END~~ + +~~START~~ +varchar +master.babel_5448_s1 +~~END~~ + +~~START~~ +varchar +=========== START OF TRIGGER EXECUTION ========== master.babel_5448_s1 +~~END~~ + +~~START~~ +nvarchar +master.babel_5448_s1 +~~END~~ + +~~START~~ +nvarchar +master.babel_5448_s1 +temp inserted row to check DML and trigger executiong +~~END~~ + +~~START~~ +varchar +=========== END OF TRIGGER EXECUTION ========== master.babel_5448_s1 +~~END~~ + +~~ROW COUNT: 1~~ + +~~ROW COUNT: 1~~ + +~~START~~ +nvarchar#!#nvarchar +master.babel_5448_s1#!#master.babel_5448_s1 +master.babel_5448_s1#!#temp inserted row to check DML and trigger executiong +~~END~~ + + +-- All objects should resolve to master.dbo schema in this call +EXEC master.babel_5448_s1.babel_5448_p1 +GO +~~START~~ +nvarchar#!#nvarchar +master.dbo#!#master.dbo +~~END~~ + +~~START~~ +varchar +master.dbo +~~END~~ + +~~START~~ +varchar +=========== START OF TRIGGER EXECUTION ========== master.dbo +~~END~~ + +~~START~~ +nvarchar +master.dbo +~~END~~ + +~~START~~ +nvarchar +master.dbo +temp inserted row to check DML and trigger executiong +~~END~~ + +~~START~~ +varchar +=========== END OF TRIGGER EXECUTION ========== master.dbo +~~END~~ + +~~ROW COUNT: 1~~ + +~~ROW COUNT: 1~~ + +~~START~~ +nvarchar +master.dbo +~~END~~ + diff --git a/test/JDBC/expected/sp_proc.out b/test/JDBC/expected/sp_proc.out index 0bf6a4157c6..8ee9d367c67 100644 --- a/test/JDBC/expected/sp_proc.out +++ b/test/JDBC/expected/sp_proc.out @@ -213,9 +213,96 @@ go ~~ERROR (Message: procedure @a() does not exist)~~ +use master +go +create table sometableinmaster(somecolumn INT) +go +use db1 +go +create schema s1 +go + +-- should resolve to db1.dbo.sp_hello +exec db1.dbo.sp_hello +go +~~ERROR (Code: 8134)~~ + +~~ERROR (Message: division by zero)~~ + +exec db1..sp_hello +go +~~ERROR (Code: 8134)~~ + +~~ERROR (Message: division by zero)~~ + + +-- should throw an error +exec db1.sys.sp_hello +go +~~ERROR (Code: 33557097)~~ + +~~ERROR (Message: procedure sys.sp_hello() does not exist)~~ + + +-- should thorw an error +exec db1.s1.sp_hello +go +~~ERROR (Code: 33557097)~~ + +~~ERROR (Message: procedure s1.sp_hello() does not exist)~~ + + drop proc sp_hello; go +-- should resolve to master.dbo.sp_hello since proc does not exists in db1 +-- special behaviour for sp_ procs +exec db1.dbo.sp_hello +go +~~START~~ +int +1 +~~END~~ + +exec db1..sp_hello +go +~~START~~ +int +1 +~~END~~ + + +-- should resolve to sys sp_tables +exec db1.dbo.sp_tables +go +~~START~~ +varchar#!#varchar#!#varchar#!#varchar#!#varchar +db1#!#dbo#!#sysdatabases#!#VIEW#!# +~~END~~ + +exec db1..sp_tables +go +~~START~~ +varchar#!#varchar#!#varchar#!#varchar#!#varchar +db1#!#dbo#!#sysdatabases#!#VIEW#!# +~~END~~ + +-- procedure should be executed as if current db was master +exec master..sp_tables @table_name = N'sometableinmaster' +go +~~START~~ +varchar#!#varchar#!#varchar#!#varchar#!#varchar +master#!#dbo#!#sometableinmaster#!#TABLE#!# +~~END~~ + +exec master.dbo.sp_tables @table_name = N'sometableinmaster' +go +~~START~~ +varchar#!#varchar#!#varchar#!#varchar#!#varchar +master#!#dbo#!#sometableinmaster#!#TABLE#!# +~~END~~ + + use master go @@ -409,6 +496,8 @@ go use master go +drop table sometableinmaster +go drop proc sp_hello go diff --git a/test/JDBC/input/object_resolution/BABEL_OBJECT_RESOLUTION_IN_ROUTINES-vu-cleanup.mix b/test/JDBC/input/object_resolution/BABEL_OBJECT_RESOLUTION_IN_ROUTINES-vu-cleanup.mix new file mode 100644 index 00000000000..610c0645fec --- /dev/null +++ b/test/JDBC/input/object_resolution/BABEL_OBJECT_RESOLUTION_IN_ROUTINES-vu-cleanup.mix @@ -0,0 +1,36 @@ +-- tsql +DROP DATABASE babel_5448_db +GO + +DROP PROC dbo.babel_5448_p, dbo.babel_5448_p1 +GO +DROP PROC babel_5448_user_default_schema.babel_5448_p, babel_5448_user_default_schema.babel_5448_p1 +GO +DROP PROC babel_5448_s1.babel_5448_p, babel_5448_s1.babel_5448_p1 +GO + +DROP FUNCTION dbo.babel_5448_f +GO +DROP FUNCTION babel_5448_user_default_schema.babel_5448_f +GO +DROP FUNCTION babel_5448_s1.babel_5448_f +GO + +DROP TABLE dbo.babel_5448_t +GO +DROP TABLE babel_5448_user_default_schema.babel_5448_t +GO +DROP TABLE babel_5448_s1.babel_5448_t +GO + +DROP VIEW dbo.babel_5448_v +GO +DROP VIEW babel_5448_user_default_schema.babel_5448_v +GO +DROP VIEW babel_5448_s1.babel_5448_v +GO + +DROP SCHEMA babel_5448_user_default_schema +GO +DROP SCHEMA babel_5448_s1 +GO \ No newline at end of file diff --git a/test/JDBC/input/object_resolution/BABEL_OBJECT_RESOLUTION_IN_ROUTINES-vu-prepare.mix b/test/JDBC/input/object_resolution/BABEL_OBJECT_RESOLUTION_IN_ROUTINES-vu-prepare.mix new file mode 100644 index 00000000000..77183373d1c --- /dev/null +++ b/test/JDBC/input/object_resolution/BABEL_OBJECT_RESOLUTION_IN_ROUTINES-vu-prepare.mix @@ -0,0 +1,271 @@ +-- In this test file we will test babelfish object resolution inside procedure functions and triggers + +-- At high level there are four cases to tests +-- 1. CROSS DB routine calls +-- 2. Same DB routine calls +-- 3. CROSS DB non default user schema +-- 4. Same DB non default user schema + +-- Then each case will be tested against subcases like +-- 1. DMLs +-- 2. DDLs +-- 3. Cross databases objects references +-- 4. EXEC procedure call statements +-- 5. Other tsql statements + +-- Each tests will need to be repeated thrice since search path will have two schemas and on the third attemp we should get object does not exists errors +-- 1. Object exists in the first schema +-- 2. Object does not exists in the first schema but does exists in second schema +-- 3. We should error out now, if object is not a schema sys object and not schema qualified + +-- Another important case to test is scope handling +-- This means that search path and current logical database value should be set and reset correctly +-- and we do not leak any of these values in any case +-- For example a search path which was set inside the procedure should not be used for queries after the procedure has ended +-- So we need tests cases like EXEC s1.p; SELECT * FROM t; and check if t is resolved correctly. + + +/***************************************/ +/*************** SAME DB ***************/ +/***************************************/ + +/******** SETUP ********/ + +-- We will work with 3 schemas "dbo" & + +-- tsql +USE master +GO +CREATE SCHEMA babel_5448_user_default_schema +GO +CREATE SCHEMA babel_5448_s1 +GO + +-- Now create objects in all three schemas +CREATE TABLE dbo.babel_5448_t (id NVARCHAR(max)) +GO +CREATE TABLE babel_5448_user_default_schema.babel_5448_t (id NVARCHAR(max)) +GO +CREATE TABLE babel_5448_s1.babel_5448_t (id NVARCHAR(max)) +GO + +INSERT INTO dbo.babel_5448_t VALUES ('master.dbo') +INSERT INTO babel_5448_user_default_schema.babel_5448_t VALUES ('master.babel_5448_user_default_schema') +INSERT INTO babel_5448_s1.babel_5448_t VALUES ('master.babel_5448_s1') +GO + +CREATE PROCEDURE dbo.babel_5448_p AS SELECT 'master.dbo' AS col1 +GO +CREATE PROCEDURE babel_5448_user_default_schema.babel_5448_p AS SELECT 'master.babel_5448_user_default_schema' AS col1 +GO +CREATE PROCEDURE babel_5448_s1.babel_5448_p AS SELECT 'master.babel_5448_s1' AS col1 +GO + +CREATE FUNCTION dbo.babel_5448_f() RETURNS NVARCHAR(MAX) +AS +BEGIN + RETURN 'master.dbo'; +END +GO + +CREATE FUNCTION babel_5448_user_default_schema.babel_5448_f() RETURNS NVARCHAR(MAX) +AS +BEGIN + RETURN 'master.babel_5448_user_default_schema'; +END +GO + +CREATE FUNCTION babel_5448_s1.babel_5448_f() RETURNS NVARCHAR(MAX) +AS +BEGIN + RETURN 'master.babel_5448_s1'; +END +GO + +CREATE VIEW dbo.babel_5448_v AS SELECT 'master.dbo' AS col1 +GO +CREATE VIEW babel_5448_user_default_schema.babel_5448_v AS SELECT 'master.babel_5448_user_default_schema' AS col1 +GO +CREATE VIEW babel_5448_s1.babel_5448_v AS SELECT 'master.babel_5448_s1' AS col1 +GO + +CREATE TRIGGER dbo.babel_5448_trigger +ON dbo.babel_5448_t +AFTER INSERT AS + SELECT '=========== START OF TRIGGER EXECUTION ========== master.dbo' + SELECT dbo.babel_5448_f(); + SELECT * FROM babel_5448_t; + SELECT '=========== END OF TRIGGER EXECUTION ========== master.dbo' +GO + +CREATE TRIGGER babel_5448_user_default_schema.babel_5448_trigger +ON babel_5448_user_default_schema.babel_5448_t +AFTER INSERT AS + SELECT '=========== START OF TRIGGER EXECUTION ========== master.babel_5448_user_default_schema' + SELECT babel_5448_user_default_schema.babel_5448_f(); + SELECT * FROM babel_5448_t; + SELECT '=========== END OF TRIGGER EXECUTION ========== master.babel_5448_user_default_schema' +GO + +CREATE TRIGGER babel_5448_s1.babel_5448_trigger +ON babel_5448_s1.babel_5448_t +AFTER INSERT AS + SELECT '=========== START OF TRIGGER EXECUTION ========== master.babel_5448_s1' + SELECT babel_5448_s1.babel_5448_f(); + SELECT * FROM babel_5448_t; + SELECT '=========== END OF TRIGGER EXECUTION ========== master.babel_5448_s1' +GO + +CREATE PROCEDURE dbo.babel_5448_p1 +AS + SELECT babel_5448_f(), * FROM babel_5448_t; + -- EXEC call should still resolve to dbo.babel_5448_p + EXEC babel_5448_p; + INSERT INTO babel_5448_t VALUES ('temp inserted row to check DML and trigger executiong'); + DELETE FROM babel_5448_t WHERE length(id) > 50; + -- CHECK IF ROW WAS DELETED FROM THE RIGHT TABLE + SELECT * FROM babel_5448_t; +GO + +CREATE PROCEDURE babel_5448_user_default_schema.babel_5448_p1 +AS + SELECT babel_5448_f(), * FROM babel_5448_t; + -- EXEC call should still resolve to dbo.babel_5448_p + EXEC babel_5448_p; + INSERT INTO babel_5448_t VALUES ('temp inserted row to check DML and trigger executiong'); + DELETE FROM babel_5448_t WHERE length(id) > 50; + -- CHECK IF ROW WAS DELETED FROM THE RIGHT TABLE + SELECT * FROM babel_5448_t; +GO + +CREATE PROCEDURE babel_5448_s1.babel_5448_p1 +AS + SELECT babel_5448_f(), * FROM babel_5448_t; + -- EXEC call should still resolve to dbo.babel_5448_p + EXEC babel_5448_p; + INSERT INTO babel_5448_t VALUES ('temp inserted row to check DML and trigger executiong'); + DELETE FROM babel_5448_t WHERE length(id) > 50; + -- CHECK IF ROW WAS DELETED FROM THE RIGHT TABLE + SELECT * FROM babel_5448_t; +GO + +/***************************************/ +/************** CROSS DB ***************/ +/***************************************/ + +CREATE DATABASE babel_5448_db +GO +USE babel_5448_db +GO +CREATE SCHEMA babel_5448_user_default_schema +GO +CREATE SCHEMA babel_5448_s1 +GO + +-- Now create objects in all three schemas +CREATE TABLE dbo.babel_5448_t (id NVARCHAR(max)) +GO +CREATE TABLE babel_5448_user_default_schema.babel_5448_t (id NVARCHAR(max)) +GO +CREATE TABLE babel_5448_s1.babel_5448_t (id NVARCHAR(max)) +GO + +INSERT INTO dbo.babel_5448_t VALUES ('babel_5448_db.dbo') +INSERT INTO babel_5448_user_default_schema.babel_5448_t VALUES ('babel_5448_db.babel_5448_user_default_schema') +INSERT INTO babel_5448_s1.babel_5448_t VALUES ('babel_5448_db.babel_5448_s1') +GO + +CREATE PROCEDURE dbo.babel_5448_p AS SELECT 'babel_5448_db.dbo' AS col1 +GO +CREATE PROCEDURE babel_5448_user_default_schema.babel_5448_p AS SELECT 'babel_5448_db.babel_5448_user_default_schema' AS col1 +GO +CREATE PROCEDURE babel_5448_s1.babel_5448_p AS SELECT 'babel_5448_db.babel_5448_s1' AS col1 +GO + +CREATE FUNCTION dbo.babel_5448_f() RETURNS NVARCHAR(MAX) +AS +BEGIN + RETURN 'babel_5448_db.dbo'; +END +GO + +CREATE FUNCTION babel_5448_user_default_schema.babel_5448_f() RETURNS NVARCHAR(MAX) +AS +BEGIN + RETURN 'babel_5448_db.babel_5448_user_default_schema'; +END +GO + +CREATE FUNCTION babel_5448_s1.babel_5448_f() RETURNS NVARCHAR(MAX) +AS +BEGIN + RETURN 'babel_5448_db.babel_5448_s1'; +END +GO + +CREATE VIEW dbo.babel_5448_v AS SELECT 'babel_5448_db.dbo' AS col1 +GO +CREATE VIEW babel_5448_user_default_schema.babel_5448_v AS SELECT 'babel_5448_db.babel_5448_user_default_schema' AS col1 +GO +CREATE VIEW babel_5448_s1.babel_5448_v AS SELECT 'babel_5448_db.babel_5448_s1' AS col1 +GO + +CREATE TRIGGER dbo.babel_5448_trigger +ON dbo.babel_5448_t +AFTER INSERT AS + SELECT '=========== START OF TRIGGER EXECUTION ========== babel_5448_db.dbo' + SELECT dbo.babel_5448_f(); + SELECT * FROM babel_5448_t; + SELECT '=========== END OF TRIGGER EXECUTION ========== babel_5448_db.dbo' +GO + +CREATE TRIGGER babel_5448_user_default_schema.babel_5448_trigger +ON babel_5448_user_default_schema.babel_5448_t +AFTER INSERT AS + SELECT '=========== START OF TRIGGER EXECUTION ========== babel_5448_db.babel_5448_user_default_schema' + SELECT babel_5448_user_default_schema.babel_5448_f(); + SELECT * FROM babel_5448_t; + SELECT '=========== END OF TRIGGER EXECUTION ========== babel_5448_db.babel_5448_user_default_schema' +GO + +CREATE TRIGGER babel_5448_s1.babel_5448_trigger +ON babel_5448_s1.babel_5448_t +AFTER INSERT AS + SELECT '=========== START OF TRIGGER EXECUTION ========== babel_5448_db.babel_5448_s1' + SELECT babel_5448_s1.babel_5448_f(); + SELECT * FROM babel_5448_t; + SELECT '=========== END OF TRIGGER EXECUTION ========== babel_5448_db.babel_5448_s1' +GO + +CREATE PROCEDURE dbo.babel_5448_p1 +AS + SELECT babel_5448_f(), * FROM babel_5448_t; + -- EXEC call should still resolve to dbo.babel_5448_p + EXEC babel_5448_p; + INSERT INTO babel_5448_t VALUES ('temp inserted row to check DML and trigger executiong'); + DELETE FROM babel_5448_t WHERE length(id) > 50; + -- CHECK IF ROW WAS DELETED FROM THE RIGHT TABLE + SELECT * FROM babel_5448_t; +GO + +CREATE PROCEDURE babel_5448_user_default_schema.babel_5448_p1 +AS + SELECT babel_5448_f(), * FROM babel_5448_t; + -- EXEC call should still resolve to dbo.babel_5448_p + EXEC babel_5448_p; + INSERT INTO babel_5448_t VALUES ('temp inserted row to check DML and trigger executiong'); + DELETE FROM babel_5448_t WHERE length(id) > 50; + -- CHECK IF ROW WAS DELETED FROM THE RIGHT TABLE + SELECT * FROM babel_5448_t; +GO + +CREATE PROCEDURE babel_5448_s1.babel_5448_p1 +AS + SELECT babel_5448_f(), * FROM babel_5448_t; + -- EXEC call should still resolve to dbo.babel_5448_p + EXEC babel_5448_p; + INSERT INTO babel_5448_t VALUES ('temp inserted row to check DML and trigger executiong'); + DELETE FROM babel_5448_t WHERE length(id) > 50; + -- CHECK IF ROW WAS DELETED FROM THE RIGHT TABLE + SELECT * FROM babel_5448_t; +GO diff --git a/test/JDBC/input/object_resolution/BABEL_OBJECT_RESOLUTION_IN_ROUTINES-vu-verify.mix b/test/JDBC/input/object_resolution/BABEL_OBJECT_RESOLUTION_IN_ROUTINES-vu-verify.mix new file mode 100644 index 00000000000..050cbca1fe0 --- /dev/null +++ b/test/JDBC/input/object_resolution/BABEL_OBJECT_RESOLUTION_IN_ROUTINES-vu-verify.mix @@ -0,0 +1,186 @@ +-- All tests will be triggered from babel_5448_db database +-- For cross database, we will use master database + +-- tsql + +/*********************************/ +/*********** SAME DB ************/ +/*********************************/ + +USE babel_5448_db +GO + +-- All objects should resolve to babel_5448_db.dbo schema in this call +EXEC dbo.babel_5448_p1 +GO + +-- All objects should resolve to babel_5448_db.babel_5448_user_default_schema schema in this call +-- except EXEC call stmt +EXEC babel_5448_user_default_schema.babel_5448_p1 +GO + +-- All objects should resolve to babel_5448_db.babel_5448_s1 schema in this call +-- except EXEC call stmt +EXEC babel_5448_s1.babel_5448_p1 +GO + +-- Now we will run the same procedures again but this time we will references objects from other schema +-- proc in dbo will reference objects from babel_5448_user_default_schema schema +-- proc in babel_5448_user_default_schema will reference objects from babel_5448_s1 schema +-- proc in babel_5448_s1 will reference objects from dbo schema + +ALTER PROCEDURE dbo.babel_5448_p1 +AS + SELECT babel_5448_user_default_schema.babel_5448_f(), * FROM babel_5448_user_default_schema.babel_5448_t; + EXEC babel_5448_user_default_schema.babel_5448_p; + INSERT INTO babel_5448_user_default_schema.babel_5448_t VALUES ('temp inserted row to check DML and trigger executiong'); + DELETE FROM babel_5448_t WHERE length(id) > 50; + -- CHECK IF ROW WAS DELETED FROM THE RIGHT TABLE + SELECT * FROM babel_5448_user_default_schema.babel_5448_t; +GO + +ALTER PROCEDURE babel_5448_user_default_schema.babel_5448_p1 +AS + SELECT babel_5448_s1.babel_5448_f(), * FROM babel_5448_s1.babel_5448_t; + EXEC babel_5448_s1.babel_5448_p; + INSERT INTO babel_5448_s1.babel_5448_t VALUES ('temp inserted row to check DML and trigger executiong'); + DELETE FROM babel_5448_t WHERE length(id) > 50; + -- CHECK IF ROW WAS DELETED FROM THE RIGHT TABLE + SELECT babel_5448_s1.babel_5448_f(), * FROM babel_5448_s1.babel_5448_t; +GO + +ALTER PROCEDURE babel_5448_s1.babel_5448_p1 +AS + SELECT dbo.babel_5448_f(), * FROM dbo.babel_5448_t; + EXEC dbo.babel_5448_p; + INSERT INTO dbo.babel_5448_t VALUES ('temp inserted row to check DML and trigger executiong'); + DELETE FROM dbo.babel_5448_t WHERE length(id) > 50; + -- CHECK IF ROW WAS DELETED FROM THE RIGHT TABLE + SELECT * FROM dbo.babel_5448_t; +GO + +-- All objects should resolve to babel_5448_db.babel_5448_user_default_schema schema in this call +EXEC dbo.babel_5448_p1 +GO + +-- All objects should resolve to babel_5448_db.babel_5448_s1 schema in this call +EXEC babel_5448_user_default_schema.babel_5448_p1 +GO + +-- All objects should resolve to babel_5448_db.dbo schema in this call +EXEC babel_5448_s1.babel_5448_p1 +GO + +-- testing different schemas +-- procedure and function will be on same schema but +-- table & trigger will be different schema +-- basically testing row level search path changes +ALTER PROCEDURE dbo.babel_5448_p1 +AS + INSERT INTO babel_5448_user_default_schema.babel_5448_t SELECT babel_5448_f() FROM generate_series(1,3); + -- trigger execution will tells use what the function resolved to + -- and what the objects inside triggers resolved to + DELETE FROM babel_5448_user_default_schema.babel_5448_t WHERE id != 'babel_5448_db.babel_5448_user_default_schema' +GO + +ALTER PROCEDURE babel_5448_user_default_schema.babel_5448_p1 +AS + INSERT INTO babel_5448_s1.babel_5448_t SELECT babel_5448_f() FROM generate_series(1,3); + -- trigger execution will tells use what the function resolved to + -- and what the objects inside triggers resolved to + DELETE FROM babel_5448_s1.babel_5448_t WHERE id != 'babel_5448_db.babel_5448_s1' +GO + +ALTER PROCEDURE babel_5448_s1.babel_5448_p1 +AS + INSERT INTO dbo.babel_5448_t SELECT babel_5448_f() FROM generate_series(1,3); + -- trigger execution will tells use what the function resolved to + -- and what the objects inside triggers resolved to + DELETE FROM dbo.babel_5448_t WHERE id != 'babel_5448_db.dbo' +GO + + +EXEC dbo.babel_5448_p1 +GO + + +EXEC babel_5448_user_default_schema.babel_5448_p1 +GO + + +EXEC babel_5448_s1.babel_5448_p1 +GO + + +/*********************************/ +/*********** CROSS DB ************/ +/*********************************/ + +USE babel_5448_db +GO + +-- All objects should resolve to master.dbo schema in this call +EXEC master.dbo.babel_5448_p1 +GO + +-- All objects should resolve to master.babel_5448_user_default_schema schema in this call +-- except EXEC call stmt +EXEC master.babel_5448_user_default_schema.babel_5448_p1 +GO + +-- All objects should resolve to master.babel_5448_s1 schema in this call +-- except EXEC call stmt +EXEC master.babel_5448_s1.babel_5448_p1 +GO + +-- Now we need to alter the procedure so switch to master database +-- alter the master database procedures and then execute then from +-- babel_5448_db again +USE master +GO + +ALTER PROCEDURE dbo.babel_5448_p1 +AS + SELECT babel_5448_user_default_schema.babel_5448_f(), * FROM babel_5448_user_default_schema.babel_5448_t; + EXEC babel_5448_user_default_schema.babel_5448_p; + INSERT INTO babel_5448_user_default_schema.babel_5448_t VALUES ('temp inserted row to check DML and trigger executiong'); + DELETE FROM babel_5448_t WHERE length(id) > 50; + -- CHECK IF ROW WAS DELETED FROM THE RIGHT TABLE + SELECT * FROM babel_5448_user_default_schema.babel_5448_t; +GO + +ALTER PROCEDURE babel_5448_user_default_schema.babel_5448_p1 +AS + SELECT babel_5448_s1.babel_5448_f(), * FROM babel_5448_s1.babel_5448_t; + EXEC babel_5448_s1.babel_5448_p; + INSERT INTO babel_5448_s1.babel_5448_t VALUES ('temp inserted row to check DML and trigger executiong'); + DELETE FROM babel_5448_t WHERE length(id) > 50; + -- CHECK IF ROW WAS DELETED FROM THE RIGHT TABLE + SELECT babel_5448_s1.babel_5448_f(), * FROM babel_5448_s1.babel_5448_t; +GO + +ALTER PROCEDURE babel_5448_s1.babel_5448_p1 +AS + SELECT dbo.babel_5448_f(), * FROM dbo.babel_5448_t; + EXEC dbo.babel_5448_p; + INSERT INTO dbo.babel_5448_t VALUES ('temp inserted row to check DML and trigger executiong'); + DELETE FROM dbo.babel_5448_t WHERE length(id) > 50; + -- CHECK IF ROW WAS DELETED FROM THE RIGHT TABLE + SELECT * FROM dbo.babel_5448_t; +GO + +USE babel_5448_db +GO + +-- Now execute the altered master database procedures +-- All objects should resolve to master.babel_5448_user_default_schema schema in this call +EXEC master.dbo.babel_5448_p1 +GO + +-- All objects should resolve to master.babel_5448_s1 schema in this call +EXEC master.babel_5448_user_default_schema.babel_5448_p1 +GO + +-- All objects should resolve to master.dbo schema in this call +EXEC master.babel_5448_s1.babel_5448_p1 +GO diff --git a/test/JDBC/input/sp_proc.sql b/test/JDBC/input/sp_proc.sql index 9831db05d73..30c8448c10f 100644 --- a/test/JDBC/input/sp_proc.sql +++ b/test/JDBC/input/sp_proc.sql @@ -95,9 +95,50 @@ go exec @a; go +use master +go +create table sometableinmaster(somecolumn INT) +go +use db1 +go +create schema s1 +go + +-- should resolve to db1.dbo.sp_hello +exec db1.dbo.sp_hello +go +exec db1..sp_hello +go + +-- should throw an error +exec db1.sys.sp_hello +go + +-- should thorw an error +exec db1.s1.sp_hello +go + drop proc sp_hello; go +-- should resolve to master.dbo.sp_hello since proc does not exists in db1 +-- special behaviour for sp_ procs +exec db1.dbo.sp_hello +go +exec db1..sp_hello +go + +-- should resolve to sys sp_tables +exec db1.dbo.sp_tables +go +exec db1..sp_tables +go +-- procedure should be executed as if current db was master +exec master..sp_tables @table_name = N'sometableinmaster' +go +exec master.dbo.sp_tables @table_name = N'sometableinmaster' +go + use master go @@ -193,6 +234,8 @@ go use master go +drop table sometableinmaster +go drop proc sp_hello go