30 changed files with 2712 additions and 111 deletions
-
31mysql-test/suite/compat/oracle/r/sp-cursor.result
-
239mysql-test/suite/compat/oracle/r/sp-security.result
-
936mysql-test/suite/compat/oracle/r/sp.result
-
18mysql-test/suite/compat/oracle/r/trigger.result
-
33mysql-test/suite/compat/oracle/t/sp-cursor.test
-
285mysql-test/suite/compat/oracle/t/sp-security.test
-
645mysql-test/suite/compat/oracle/t/sp.test
-
20mysql-test/suite/compat/oracle/t/trigger.test
-
39sql/field.h
-
7sql/item.cc
-
34sql/item.h
-
44sql/sp_head.cc
-
38sql/sp_head.h
-
2sql/sp_pcontext.cc
-
4sql/sp_pcontext.h
-
112sql/sp_rcontext.cc
-
16sql/sp_rcontext.h
-
45sql/sql_base.cc
-
2sql/sql_base.h
-
20sql/sql_class.h
-
57sql/sql_lex.cc
-
5sql/sql_lex.h
-
6sql/sql_select.cc
-
8sql/sql_select.h
-
23sql/sql_show.cc
-
2sql/sql_yacc.yy
-
135sql/sql_yacc_ora.yy
-
5sql/structs.h
-
11sql/table.cc
-
1sql/table.h
@ -0,0 +1,239 @@ |
|||
SET sql_mode=ORACLE; |
|||
# |
|||
# MDEV-10577 sql_mode=ORACLE: %TYPE in variable declarations |
|||
# |
|||
# |
|||
# Initiation: |
|||
# - creating database db1 |
|||
# - creating user user1 with access rights to db1 |
|||
# |
|||
CREATE DATABASE db1; |
|||
CREATE TABLE db1.t1 (a INT, b VARCHAR(10)); |
|||
CREATE USER user1; |
|||
GRANT ALL PRIVILEGES ON test.* TO user1; |
|||
connect conn1,localhost,user1,,test; |
|||
SET sql_mode=ORACLE; |
|||
SELECT database(); |
|||
database() |
|||
test |
|||
SELECT user(); |
|||
user() |
|||
user1@localhost |
|||
# |
|||
# Making sure that user1 does not have privileges to db1.t1 |
|||
# |
|||
SHOW CREATE TABLE db1.t1; |
|||
ERROR 42000: SHOW command denied to user 'user1'@'localhost' for table 't1' |
|||
SHOW FIELDS IN db1.t1; |
|||
ERROR 42000: SELECT command denied to user 'user1'@'localhost' for table 't1' |
|||
# |
|||
# Trigger: using %TYPE with a table we don't have access to |
|||
# |
|||
CREATE TABLE test.t1 (a INT, b INT); |
|||
INSERT INTO test.t1 (a,b) VALUES (10,20); |
|||
SELECT * FROM t1; |
|||
a b |
|||
10 20 |
|||
CREATE TRIGGER test.tr1 BEFORE INSERT ON test.t1 FOR EACH ROW |
|||
BEGIN |
|||
DECLARE b db1.t1.b%TYPE := 20; |
|||
BEGIN |
|||
:NEW.b := 10; |
|||
END; |
|||
END |
|||
$$ |
|||
INSERT INTO t1 (a) VALUES (10); |
|||
ERROR 42000: SELECT command denied to user 'user1'@'localhost' for table 't1' |
|||
SELECT * FROM t1; |
|||
a b |
|||
10 20 |
|||
DROP TRIGGER tr1; |
|||
DROP TABLE t1; |
|||
# |
|||
# Stored procedure: Using %TYPE for with a table that we don't have access to |
|||
# DEFINER user1, SQL SECURITY DEFAULT |
|||
# |
|||
CREATE PROCEDURE p1() |
|||
AS |
|||
a db1.t1.a%TYPE := 10; |
|||
BEGIN |
|||
SELECT a; |
|||
END; |
|||
$$ |
|||
CALL p1; |
|||
ERROR 42000: SELECT command denied to user 'user1'@'localhost' for table 't1' |
|||
DROP PROCEDURE p1; |
|||
# |
|||
# Stored procedure: Using %TYPE for with a table that we don't have access to |
|||
# DEFINER root, SQL SECURITY INVOKER |
|||
# |
|||
connection default; |
|||
CREATE PROCEDURE p1() |
|||
SQL SECURITY INVOKER |
|||
AS |
|||
a db1.t1.a%TYPE := 10; |
|||
BEGIN |
|||
SELECT a; |
|||
END; |
|||
$$ |
|||
connection conn1; |
|||
CALL p1; |
|||
ERROR 42000: SELECT command denied to user 'user1'@'localhost' for table 't1' |
|||
DROP PROCEDURE p1; |
|||
# |
|||
# Stored procedure: Using %TYPE for with a table that we don't have access to |
|||
# DEFINER root, SQL SECURITY DEFINER |
|||
# |
|||
connection default; |
|||
CREATE PROCEDURE p1() |
|||
SQL SECURITY DEFINER |
|||
AS |
|||
a db1.t1.a%TYPE := 10; |
|||
BEGIN |
|||
SELECT a; |
|||
END; |
|||
$$ |
|||
connection conn1; |
|||
CALL p1; |
|||
a |
|||
10 |
|||
DROP PROCEDURE p1; |
|||
# |
|||
# Stored function: Using %TYPE for with a table that we don't have access to |
|||
# DEFINER user1, SQL SECURITY DEFAULT |
|||
# |
|||
CREATE TABLE t1 (a INT); |
|||
CREATE FUNCTION f1() RETURN INT |
|||
AS |
|||
a db1.t1.a%TYPE:=0; |
|||
BEGIN |
|||
RETURN OCTET_LENGTH(a); |
|||
END; |
|||
$$ |
|||
SELECT f1(); |
|||
ERROR 42000: SELECT command denied to user 'user1'@'localhost' for table 't1' |
|||
DROP FUNCTION f1; |
|||
DROP TABLE t1; |
|||
# |
|||
# Stored function: Using %TYPE for with a table that we don't have access to |
|||
# DEFINER root, SQL SECURITY INVOKER |
|||
# |
|||
connection default; |
|||
CREATE TABLE t1 (a INT); |
|||
CREATE FUNCTION f1() RETURN INT |
|||
SQL SECURITY INVOKER |
|||
AS |
|||
a db1.t1.a%TYPE:=0; |
|||
BEGIN |
|||
RETURN OCTET_LENGTH(a); |
|||
END; |
|||
$$ |
|||
connection conn1; |
|||
SELECT f1(); |
|||
ERROR 42000: SELECT command denied to user 'user1'@'localhost' for table 't1' |
|||
DROP FUNCTION f1; |
|||
DROP TABLE t1; |
|||
# |
|||
# Stored function: Using %TYPE for with a table that we don't have access to |
|||
# DEFINER root, SQL SECURITY DEFINER |
|||
# |
|||
connection default; |
|||
CREATE TABLE t1 (a INT); |
|||
CREATE FUNCTION f1() RETURN INT |
|||
SQL SECURITY DEFINER |
|||
AS |
|||
a db1.t1.a%TYPE:=0; |
|||
BEGIN |
|||
RETURN OCTET_LENGTH(a); |
|||
END; |
|||
$$ |
|||
connection conn1; |
|||
SELECT f1(); |
|||
f1() |
|||
1 |
|||
DROP FUNCTION f1; |
|||
DROP TABLE t1; |
|||
connection default; |
|||
GRANT SELECT (a) ON db1.t1 TO user1; |
|||
connection conn1; |
|||
# |
|||
# Making sure that user1 has access to db1.t1.a, but not to db1.t1.b |
|||
# |
|||
SHOW CREATE TABLE db1.t1; |
|||
ERROR 42000: SHOW command denied to user 'user1'@'localhost' for table 't1' |
|||
SHOW FIELDS IN db1.t1; |
|||
Field Type Null Key Default Extra |
|||
a int(11) YES NULL |
|||
# |
|||
# Trigger: Per-column privileges |
|||
# |
|||
CREATE TABLE test.t1 (a INT, b INT); |
|||
INSERT INTO test.t1 (a,b) VALUES (10,20); |
|||
SELECT * FROM t1; |
|||
a b |
|||
10 20 |
|||
CREATE TRIGGER test.tr1 BEFORE INSERT ON test.t1 FOR EACH ROW |
|||
BEGIN |
|||
DECLARE a db1.t1.a%TYPE := 20; |
|||
BEGIN |
|||
:NEW.b := 10; |
|||
END; |
|||
END |
|||
$$ |
|||
INSERT INTO t1 (a) VALUES (10); |
|||
SELECT * FROM t1; |
|||
a b |
|||
10 20 |
|||
10 10 |
|||
DROP TRIGGER tr1; |
|||
CREATE TRIGGER test.tr1 BEFORE INSERT ON test.t1 FOR EACH ROW |
|||
BEGIN |
|||
DECLARE b db1.t1.b%TYPE := 20; |
|||
BEGIN |
|||
:NEW.b := 10; |
|||
END; |
|||
END |
|||
$$ |
|||
INSERT INTO t1 (a) VALUES (10); |
|||
ERROR 42000: SELECT command denied to user 'user1'@'localhost' for column 'b' in table 't1' |
|||
SELECT * FROM t1; |
|||
a b |
|||
10 20 |
|||
10 10 |
|||
DROP TRIGGER tr1; |
|||
DROP TABLE t1; |
|||
# |
|||
# Stored procedure: Per-column privileges |
|||
# DEFINER user1, SQL SECURITY DEFAULT |
|||
# |
|||
CREATE PROCEDURE p1() |
|||
AS |
|||
a db1.t1.a%TYPE := 10; |
|||
BEGIN |
|||
SELECT a; |
|||
END; |
|||
$$ |
|||
CALL p1; |
|||
a |
|||
10 |
|||
DROP PROCEDURE p1; |
|||
CREATE PROCEDURE p1() |
|||
AS |
|||
b db1.t1.b%TYPE := 10; |
|||
BEGIN |
|||
SELECT b; |
|||
END; |
|||
$$ |
|||
CALL p1; |
|||
ERROR 42000: SELECT command denied to user 'user1'@'localhost' for column 'b' in table 't1' |
|||
DROP PROCEDURE p1; |
|||
# |
|||
# Clean up |
|||
# |
|||
disconnect conn1; |
|||
connection default; |
|||
DROP USER user1; |
|||
DROP DATABASE db1; |
|||
# |
|||
# End of MDEV-10577 sql_mode=ORACLE: %TYPE in variable declarations |
|||
# |
|||
@ -0,0 +1,285 @@ |
|||
--source include/not_embedded.inc |
|||
|
|||
SET sql_mode=ORACLE; |
|||
|
|||
--echo # |
|||
--echo # MDEV-10577 sql_mode=ORACLE: %TYPE in variable declarations |
|||
--echo # |
|||
|
|||
|
|||
--echo # |
|||
--echo # Initiation: |
|||
--echo # - creating database db1 |
|||
--echo # - creating user user1 with access rights to db1 |
|||
--echo # |
|||
|
|||
CREATE DATABASE db1; |
|||
CREATE TABLE db1.t1 (a INT, b VARCHAR(10)); |
|||
|
|||
CREATE USER user1; |
|||
|
|||
GRANT ALL PRIVILEGES ON test.* TO user1; |
|||
|
|||
connect (conn1,localhost,user1,,test); |
|||
SET sql_mode=ORACLE; |
|||
|
|||
SELECT database(); |
|||
SELECT user(); |
|||
|
|||
--echo # |
|||
--echo # Making sure that user1 does not have privileges to db1.t1 |
|||
--echo # |
|||
|
|||
--error ER_TABLEACCESS_DENIED_ERROR |
|||
SHOW CREATE TABLE db1.t1; |
|||
--error ER_TABLEACCESS_DENIED_ERROR |
|||
SHOW FIELDS IN db1.t1; |
|||
|
|||
|
|||
--echo # |
|||
--echo # Trigger: using %TYPE with a table we don't have access to |
|||
--echo # |
|||
CREATE TABLE test.t1 (a INT, b INT); |
|||
INSERT INTO test.t1 (a,b) VALUES (10,20); |
|||
SELECT * FROM t1; |
|||
DELIMITER $$; |
|||
CREATE TRIGGER test.tr1 BEFORE INSERT ON test.t1 FOR EACH ROW |
|||
BEGIN |
|||
DECLARE b db1.t1.b%TYPE := 20; |
|||
BEGIN |
|||
:NEW.b := 10; |
|||
END; |
|||
END |
|||
$$ |
|||
DELIMITER ;$$ |
|||
--error ER_TABLEACCESS_DENIED_ERROR |
|||
INSERT INTO t1 (a) VALUES (10); |
|||
SELECT * FROM t1; |
|||
DROP TRIGGER tr1; |
|||
DROP TABLE t1; |
|||
|
|||
|
|||
--echo # |
|||
--echo # Stored procedure: Using %TYPE for with a table that we don't have access to |
|||
--echo # DEFINER user1, SQL SECURITY DEFAULT |
|||
--echo # |
|||
|
|||
DELIMITER $$; |
|||
CREATE PROCEDURE p1() |
|||
AS |
|||
a db1.t1.a%TYPE := 10; |
|||
BEGIN |
|||
SELECT a; |
|||
END; |
|||
$$ |
|||
DELIMITER ;$$ |
|||
--error ER_TABLEACCESS_DENIED_ERROR |
|||
CALL p1; |
|||
DROP PROCEDURE p1; |
|||
|
|||
|
|||
--echo # |
|||
--echo # Stored procedure: Using %TYPE for with a table that we don't have access to |
|||
--echo # DEFINER root, SQL SECURITY INVOKER |
|||
--echo # |
|||
|
|||
connection default; |
|||
DELIMITER $$; |
|||
CREATE PROCEDURE p1() |
|||
SQL SECURITY INVOKER |
|||
AS |
|||
a db1.t1.a%TYPE := 10; |
|||
BEGIN |
|||
SELECT a; |
|||
END; |
|||
$$ |
|||
DELIMITER ;$$ |
|||
connection conn1; |
|||
--error ER_TABLEACCESS_DENIED_ERROR |
|||
CALL p1; |
|||
DROP PROCEDURE p1; |
|||
|
|||
|
|||
--echo # |
|||
--echo # Stored procedure: Using %TYPE for with a table that we don't have access to |
|||
--echo # DEFINER root, SQL SECURITY DEFINER |
|||
--echo # |
|||
|
|||
connection default; |
|||
DELIMITER $$; |
|||
CREATE PROCEDURE p1() |
|||
SQL SECURITY DEFINER |
|||
AS |
|||
a db1.t1.a%TYPE := 10; |
|||
BEGIN |
|||
SELECT a; |
|||
END; |
|||
$$ |
|||
DELIMITER ;$$ |
|||
connection conn1; |
|||
CALL p1; |
|||
DROP PROCEDURE p1; |
|||
|
|||
|
|||
--echo # |
|||
--echo # Stored function: Using %TYPE for with a table that we don't have access to |
|||
--echo # DEFINER user1, SQL SECURITY DEFAULT |
|||
--echo # |
|||
|
|||
CREATE TABLE t1 (a INT); |
|||
DELIMITER $$; |
|||
CREATE FUNCTION f1() RETURN INT |
|||
AS |
|||
a db1.t1.a%TYPE:=0; |
|||
BEGIN |
|||
RETURN OCTET_LENGTH(a); |
|||
END; |
|||
$$ |
|||
DELIMITER ;$$ |
|||
--error ER_TABLEACCESS_DENIED_ERROR |
|||
SELECT f1(); |
|||
DROP FUNCTION f1; |
|||
DROP TABLE t1; |
|||
|
|||
|
|||
--echo # |
|||
--echo # Stored function: Using %TYPE for with a table that we don't have access to |
|||
--echo # DEFINER root, SQL SECURITY INVOKER |
|||
--echo # |
|||
|
|||
connection default; |
|||
CREATE TABLE t1 (a INT); |
|||
DELIMITER $$; |
|||
CREATE FUNCTION f1() RETURN INT |
|||
SQL SECURITY INVOKER |
|||
AS |
|||
a db1.t1.a%TYPE:=0; |
|||
BEGIN |
|||
RETURN OCTET_LENGTH(a); |
|||
END; |
|||
$$ |
|||
DELIMITER ;$$ |
|||
connection conn1; |
|||
--error ER_TABLEACCESS_DENIED_ERROR |
|||
SELECT f1(); |
|||
DROP FUNCTION f1; |
|||
DROP TABLE t1; |
|||
|
|||
|
|||
--echo # |
|||
--echo # Stored function: Using %TYPE for with a table that we don't have access to |
|||
--echo # DEFINER root, SQL SECURITY DEFINER |
|||
--echo # |
|||
|
|||
connection default; |
|||
CREATE TABLE t1 (a INT); |
|||
DELIMITER $$; |
|||
CREATE FUNCTION f1() RETURN INT |
|||
SQL SECURITY DEFINER |
|||
AS |
|||
a db1.t1.a%TYPE:=0; |
|||
BEGIN |
|||
RETURN OCTET_LENGTH(a); |
|||
END; |
|||
$$ |
|||
DELIMITER ;$$ |
|||
connection conn1; |
|||
SELECT f1(); |
|||
DROP FUNCTION f1; |
|||
DROP TABLE t1; |
|||
|
|||
|
|||
connection default; |
|||
GRANT SELECT (a) ON db1.t1 TO user1; |
|||
connection conn1; |
|||
|
|||
--echo # |
|||
--echo # Making sure that user1 has access to db1.t1.a, but not to db1.t1.b |
|||
--echo # |
|||
|
|||
--error ER_TABLEACCESS_DENIED_ERROR |
|||
SHOW CREATE TABLE db1.t1; |
|||
SHOW FIELDS IN db1.t1; |
|||
|
|||
--echo # |
|||
--echo # Trigger: Per-column privileges |
|||
--echo # |
|||
CREATE TABLE test.t1 (a INT, b INT); |
|||
INSERT INTO test.t1 (a,b) VALUES (10,20); |
|||
SELECT * FROM t1; |
|||
# %TYPE reference using a column we have access to |
|||
DELIMITER $$; |
|||
CREATE TRIGGER test.tr1 BEFORE INSERT ON test.t1 FOR EACH ROW |
|||
BEGIN |
|||
DECLARE a db1.t1.a%TYPE := 20; |
|||
BEGIN |
|||
:NEW.b := 10; |
|||
END; |
|||
END |
|||
$$ |
|||
DELIMITER ;$$ |
|||
INSERT INTO t1 (a) VALUES (10); |
|||
SELECT * FROM t1; |
|||
DROP TRIGGER tr1; |
|||
# %TYPE reference using a column that we don't have access to |
|||
DELIMITER $$; |
|||
CREATE TRIGGER test.tr1 BEFORE INSERT ON test.t1 FOR EACH ROW |
|||
BEGIN |
|||
DECLARE b db1.t1.b%TYPE := 20; |
|||
BEGIN |
|||
:NEW.b := 10; |
|||
END; |
|||
END |
|||
$$ |
|||
DELIMITER ;$$ |
|||
--error ER_COLUMNACCESS_DENIED_ERROR |
|||
INSERT INTO t1 (a) VALUES (10); |
|||
SELECT * FROM t1; |
|||
DROP TRIGGER tr1; |
|||
DROP TABLE t1; |
|||
|
|||
|
|||
|
|||
--echo # |
|||
--echo # Stored procedure: Per-column privileges |
|||
--echo # DEFINER user1, SQL SECURITY DEFAULT |
|||
--echo # |
|||
|
|||
DELIMITER $$; |
|||
CREATE PROCEDURE p1() |
|||
AS |
|||
a db1.t1.a%TYPE := 10; |
|||
BEGIN |
|||
SELECT a; |
|||
END; |
|||
$$ |
|||
DELIMITER ;$$ |
|||
CALL p1; |
|||
DROP PROCEDURE p1; |
|||
|
|||
DELIMITER $$; |
|||
CREATE PROCEDURE p1() |
|||
AS |
|||
b db1.t1.b%TYPE := 10; |
|||
BEGIN |
|||
SELECT b; |
|||
END; |
|||
$$ |
|||
DELIMITER ;$$ |
|||
--error ER_COLUMNACCESS_DENIED_ERROR |
|||
CALL p1; |
|||
DROP PROCEDURE p1; |
|||
|
|||
|
|||
--echo # |
|||
--echo # Clean up |
|||
--echo # |
|||
disconnect conn1; |
|||
connection default; |
|||
|
|||
DROP USER user1; |
|||
DROP DATABASE db1; |
|||
|
|||
--echo # |
|||
--echo # End of MDEV-10577 sql_mode=ORACLE: %TYPE in variable declarations |
|||
--echo # |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue