mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
merge
This commit is contained in:
@ -594,7 +594,7 @@ TABLE_CONSTRAINTS
|
|||||||
TABLE_PRIVILEGES
|
TABLE_PRIVILEGES
|
||||||
TRIGGERS
|
TRIGGERS
|
||||||
create database information_schema;
|
create database information_schema;
|
||||||
ERROR HY000: Can't create database 'information_schema'; database exists
|
ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
|
||||||
use information_schema;
|
use information_schema;
|
||||||
show full tables like "T%";
|
show full tables like "T%";
|
||||||
Tables_in_information_schema (T%) Table_type
|
Tables_in_information_schema (T%) Table_type
|
||||||
@ -990,3 +990,25 @@ Field Type Null Key Default Extra
|
|||||||
c int(11) YES NULL
|
c int(11) YES NULL
|
||||||
drop view v1;
|
drop view v1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
alter database information_schema;
|
||||||
|
ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
|
||||||
|
drop database information_schema;
|
||||||
|
ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
|
||||||
|
drop table information_schema.tables;
|
||||||
|
ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
|
||||||
|
alter table information_schema.tables;
|
||||||
|
ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
|
||||||
|
use information_schema;
|
||||||
|
create temporary table schemata(f1 char(10));
|
||||||
|
ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
|
||||||
|
CREATE PROCEDURE p1 ()
|
||||||
|
BEGIN
|
||||||
|
SELECT 'foo' FROM DUAL;
|
||||||
|
END |
|
||||||
|
ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
|
||||||
|
select ROUTINE_NAME from routines;
|
||||||
|
ROUTINE_NAME
|
||||||
|
grant all on information_schema.* to 'user1'@'localhost';
|
||||||
|
ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
|
||||||
|
grant select on information_schema.* to 'user1'@'localhost';
|
||||||
|
ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
|
||||||
|
@ -140,6 +140,64 @@ b+0
|
|||||||
499
|
499
|
||||||
drop table t1;
|
drop table t1;
|
||||||
create table t1 (
|
create table t1 (
|
||||||
|
dummyKey INTEGER NOT NULL,
|
||||||
|
a001 TINYINT,
|
||||||
|
a010 TINYINT,
|
||||||
|
a012 TINYINT,
|
||||||
|
a015 TINYINT,
|
||||||
|
a016 TINYINT,
|
||||||
|
a017 TINYINT,
|
||||||
|
a019 TINYINT,
|
||||||
|
a029 TINYINT,
|
||||||
|
a030 TINYINT,
|
||||||
|
a031 TINYINT,
|
||||||
|
a032 TINYINT,
|
||||||
|
a042 TINYINT,
|
||||||
|
a043 TINYINT,
|
||||||
|
a044 TINYINT,
|
||||||
|
a3001 TINYINT,
|
||||||
|
a3002 TINYINT,
|
||||||
|
a3003 TINYINT,
|
||||||
|
a3004 TINYINT,
|
||||||
|
a3005 TINYINT,
|
||||||
|
a3021 TINYINT,
|
||||||
|
a3022 TINYINT,
|
||||||
|
a BIT(6),
|
||||||
|
b BIT(6),
|
||||||
|
c BIT(6),
|
||||||
|
d TINYINT,
|
||||||
|
e TINYINT,
|
||||||
|
f TINYINT,
|
||||||
|
g TINYINT,
|
||||||
|
h TINYINT,
|
||||||
|
i TINYINT,
|
||||||
|
j TINYINT,
|
||||||
|
k TINYINT,
|
||||||
|
l TINYINT,
|
||||||
|
m TINYINT,
|
||||||
|
n TINYINT,
|
||||||
|
o TINYINT,
|
||||||
|
a034 TINYINT,
|
||||||
|
PRIMARY KEY USING HASH (dummyKey) ) engine=ndb;
|
||||||
|
INSERT INTO `t1` VALUES
|
||||||
|
(1,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b'000001',b'111111',b'111110',4,5,5,5,5,5,5,5,5,5,3,2,1),
|
||||||
|
(2,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b'000010',b'000000',b'111101',4,5,5,5,5,5,5,5,5,5,3,2,1),
|
||||||
|
(3,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b'000100',b'001111',b'111011',4,5,5,5,5,5,5,5,5,5,3,2,1),
|
||||||
|
(4,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b'001000',b'110000',b'110111',4,5,5,5,5,5,5,5,5,5,3,2,1),
|
||||||
|
(5,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b'010000',b'100001',b'101111',4,5,5,5,5,5,5,5,5,5,3,2,1),
|
||||||
|
(6,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b'100000',b'010010',b'011111',4,5,5,5,5,5,5,5,5,5,3,2,1),
|
||||||
|
(7,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b'000000',b'001100',b'111111',4,5,5,5,5,5,5,5,5,5,3,2,1),
|
||||||
|
(8,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b'111111',b'000000',b'000000',4,5,5,5,5,5,5,5,5,5,3,2,1);
|
||||||
|
INSERT INTO `t1` VALUES (1,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'','?','>',4,5,5,5,5,5,5,5,5,5,3,2,1);
|
||||||
|
INSERT INTO `t1` VALUES (2,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'','\0','=',4,5,5,5,5,5,5,5,5,5,3,2,1);
|
||||||
|
INSERT INTO `t1` VALUES (3,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'','',';',4,5,5,5,5,5,5,5,5,5,3,2,1);
|
||||||
|
INSERT INTO `t1` VALUES (4,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'','0','7',4,5,5,5,5,5,5,5,5,5,3,2,1);
|
||||||
|
INSERT INTO `t1` VALUES (5,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'','!','/',4,5,5,5,5,5,5,5,5,5,3,2,1);
|
||||||
|
INSERT INTO `t1` VALUES (6,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,' ','','',4,5,5,5,5,5,5,5,5,5,3,2,1);
|
||||||
|
INSERT INTO `t1` VALUES (7,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'\0','','?',4,5,5,5,5,5,5,5,5,5,3,2,1);
|
||||||
|
INSERT INTO `t1` VALUES (8,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'?','\0','\0',4,5,5,5,5,5,5,5,5,5,3,2,1);
|
||||||
|
drop table t1;
|
||||||
|
create table t1 (
|
||||||
pk1 bit(9) not null primary key,
|
pk1 bit(9) not null primary key,
|
||||||
b int
|
b int
|
||||||
) engine=ndbcluster;
|
) engine=ndbcluster;
|
||||||
|
@ -786,3 +786,50 @@ END|
|
|||||||
ERROR 0A000: HANDLER is not allowed in stored procedures
|
ERROR 0A000: HANDLER is not allowed in stored procedures
|
||||||
SELECT bug12995()|
|
SELECT bug12995()|
|
||||||
ERROR 42000: FUNCTION test.bug12995 does not exist
|
ERROR 42000: FUNCTION test.bug12995 does not exist
|
||||||
|
drop procedure if exists bug12712;
|
||||||
|
drop function if exists bug12712;
|
||||||
|
create procedure bug12712()
|
||||||
|
set session autocommit = 0;
|
||||||
|
select @@autocommit;
|
||||||
|
@@autocommit
|
||||||
|
1
|
||||||
|
set @au = @@autocommit;
|
||||||
|
call bug12712();
|
||||||
|
select @@autocommit;
|
||||||
|
@@autocommit
|
||||||
|
0
|
||||||
|
set session autocommit = @au;
|
||||||
|
create function bug12712()
|
||||||
|
returns int
|
||||||
|
begin
|
||||||
|
call bug12712();
|
||||||
|
return 0;
|
||||||
|
end|
|
||||||
|
set @x = bug12712()|
|
||||||
|
ERROR HY000: Not allowed to set autocommit from a stored function or trigger
|
||||||
|
drop procedure bug12712|
|
||||||
|
drop function bug12712|
|
||||||
|
create function bug12712()
|
||||||
|
returns int
|
||||||
|
begin
|
||||||
|
set session autocommit = 0;
|
||||||
|
return 0;
|
||||||
|
end|
|
||||||
|
ERROR HY000: Not allowed to set autocommit from a stored function or trigger
|
||||||
|
create function bug12712()
|
||||||
|
returns int
|
||||||
|
begin
|
||||||
|
set @@autocommit = 0;
|
||||||
|
return 0;
|
||||||
|
end|
|
||||||
|
ERROR HY000: Not allowed to set autocommit from a stored function or trigger
|
||||||
|
create function bug12712()
|
||||||
|
returns int
|
||||||
|
begin
|
||||||
|
set local autocommit = 0;
|
||||||
|
return 0;
|
||||||
|
end|
|
||||||
|
ERROR HY000: Not allowed to set autocommit from a stored function or trigger
|
||||||
|
create trigger bug12712
|
||||||
|
before insert on t1 for each row set session autocommit = 0;
|
||||||
|
ERROR HY000: Not allowed to set autocommit from a stored function or trigger
|
||||||
|
@ -3323,6 +3323,7 @@ drop function bug12379|
|
|||||||
drop procedure bug12379_1|
|
drop procedure bug12379_1|
|
||||||
drop procedure bug12379_2|
|
drop procedure bug12379_2|
|
||||||
drop procedure bug12379_3|
|
drop procedure bug12379_3|
|
||||||
|
drop table t3|
|
||||||
drop procedure if exists bug13124|
|
drop procedure if exists bug13124|
|
||||||
create procedure bug13124()
|
create procedure bug13124()
|
||||||
begin
|
begin
|
||||||
@ -3331,4 +3332,20 @@ set @x=y;
|
|||||||
end|
|
end|
|
||||||
call bug13124()|
|
call bug13124()|
|
||||||
drop procedure bug13124|
|
drop procedure bug13124|
|
||||||
|
drop procedure if exists bug12979_1|
|
||||||
|
create procedure bug12979_1(inout d decimal(5)) set d = d / 2|
|
||||||
|
set @bug12979_user_var = NULL|
|
||||||
|
call bug12979_1(@bug12979_user_var)|
|
||||||
|
drop procedure bug12979_1|
|
||||||
|
drop procedure if exists bug12979_2|
|
||||||
|
create procedure bug12979_2()
|
||||||
|
begin
|
||||||
|
declare internal_var decimal(5);
|
||||||
|
set internal_var= internal_var / 2;
|
||||||
|
select internal_var;
|
||||||
|
end|
|
||||||
|
call bug12979_2()|
|
||||||
|
internal_var
|
||||||
|
NULL
|
||||||
|
drop procedure bug12979_2|
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
|
@ -1016,3 +1016,6 @@ v tdec
|
|||||||
v tdec
|
v tdec
|
||||||
9 0
|
9 0
|
||||||
drop procedure wg2;
|
drop procedure wg2;
|
||||||
|
select cast(@non_existing_user_var/2 as DECIMAL);
|
||||||
|
cast(@non_existing_user_var/2 as DECIMAL)
|
||||||
|
NULL
|
||||||
|
@ -338,7 +338,7 @@ from information_schema.tables
|
|||||||
where table_schema='information_schema' limit 2;
|
where table_schema='information_schema' limit 2;
|
||||||
show tables from information_schema like "T%";
|
show tables from information_schema like "T%";
|
||||||
|
|
||||||
--error 1007
|
--error 1044
|
||||||
create database information_schema;
|
create database information_schema;
|
||||||
use information_schema;
|
use information_schema;
|
||||||
show full tables like "T%";
|
show full tables like "T%";
|
||||||
@ -678,3 +678,39 @@ show fields from test.v1;
|
|||||||
connection default;
|
connection default;
|
||||||
drop view v1;
|
drop view v1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #9846 Inappropriate error displayed while dropping table from 'INFORMATION_SCHEMA'
|
||||||
|
#
|
||||||
|
--error 1044
|
||||||
|
alter database information_schema;
|
||||||
|
--error 1044
|
||||||
|
drop database information_schema;
|
||||||
|
--error 1044
|
||||||
|
drop table information_schema.tables;
|
||||||
|
--error 1044
|
||||||
|
alter table information_schema.tables;
|
||||||
|
#
|
||||||
|
# Bug #9683 INFORMATION_SCH: Creation of temporary table allowed in Information_schema DB
|
||||||
|
#
|
||||||
|
use information_schema;
|
||||||
|
--error 1044
|
||||||
|
create temporary table schemata(f1 char(10));
|
||||||
|
#
|
||||||
|
# Bug #10708 SP's can use INFORMATION_SCHEMA as ROUTINE_SCHEMA
|
||||||
|
#
|
||||||
|
delimiter |;
|
||||||
|
--error 1044
|
||||||
|
CREATE PROCEDURE p1 ()
|
||||||
|
BEGIN
|
||||||
|
SELECT 'foo' FROM DUAL;
|
||||||
|
END |
|
||||||
|
delimiter ;|
|
||||||
|
select ROUTINE_NAME from routines;
|
||||||
|
#
|
||||||
|
# Bug #10734 Grant of privileges other than 'select' and 'create view' should fail on schema
|
||||||
|
#
|
||||||
|
--error 1044
|
||||||
|
grant all on information_schema.* to 'user1'@'localhost';
|
||||||
|
--error 1044
|
||||||
|
grant select on information_schema.* to 'user1'@'localhost';
|
||||||
|
@ -47,6 +47,58 @@ select a+0 from t1 order by a;
|
|||||||
select b+0 from t1 order by b;
|
select b+0 from t1 order by b;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
create table t1 (
|
||||||
|
dummyKey INTEGER NOT NULL,
|
||||||
|
a001 TINYINT,
|
||||||
|
a010 TINYINT,
|
||||||
|
a012 TINYINT,
|
||||||
|
a015 TINYINT,
|
||||||
|
a016 TINYINT,
|
||||||
|
a017 TINYINT,
|
||||||
|
a019 TINYINT,
|
||||||
|
a029 TINYINT,
|
||||||
|
a030 TINYINT,
|
||||||
|
a031 TINYINT,
|
||||||
|
a032 TINYINT,
|
||||||
|
a042 TINYINT,
|
||||||
|
a043 TINYINT,
|
||||||
|
a044 TINYINT,
|
||||||
|
a3001 TINYINT,
|
||||||
|
a3002 TINYINT,
|
||||||
|
a3003 TINYINT,
|
||||||
|
a3004 TINYINT,
|
||||||
|
a3005 TINYINT,
|
||||||
|
a3021 TINYINT,
|
||||||
|
a3022 TINYINT,
|
||||||
|
a BIT(6),
|
||||||
|
b BIT(6),
|
||||||
|
c BIT(6),
|
||||||
|
d TINYINT,
|
||||||
|
e TINYINT,
|
||||||
|
f TINYINT,
|
||||||
|
g TINYINT,
|
||||||
|
h TINYINT,
|
||||||
|
i TINYINT,
|
||||||
|
j TINYINT,
|
||||||
|
k TINYINT,
|
||||||
|
l TINYINT,
|
||||||
|
m TINYINT,
|
||||||
|
n TINYINT,
|
||||||
|
o TINYINT,
|
||||||
|
a034 TINYINT,
|
||||||
|
PRIMARY KEY USING HASH (dummyKey) ) engine=ndb;
|
||||||
|
INSERT INTO `t1` VALUES
|
||||||
|
(1,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b'000001',b'111111',b'111110',4,5,5,5,5,5,5,5,5,5,3,2,1),
|
||||||
|
(2,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b'000010',b'000000',b'111101',4,5,5,5,5,5,5,5,5,5,3,2,1),
|
||||||
|
(3,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b'000100',b'001111',b'111011',4,5,5,5,5,5,5,5,5,5,3,2,1),
|
||||||
|
(4,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b'001000',b'110000',b'110111',4,5,5,5,5,5,5,5,5,5,3,2,1),
|
||||||
|
(5,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b'010000',b'100001',b'101111',4,5,5,5,5,5,5,5,5,5,3,2,1),
|
||||||
|
(6,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b'100000',b'010010',b'011111',4,5,5,5,5,5,5,5,5,5,3,2,1),
|
||||||
|
(7,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b'000000',b'001100',b'111111',4,5,5,5,5,5,5,5,5,5,3,2,1),
|
||||||
|
(8,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b'111111',b'000000',b'000000',4,5,5,5,5,5,5,5,5,5,3,2,1);
|
||||||
|
--exec $MYSQL_DUMP --compact --order-by-primary --skip-extended-insert --no-create-info test t1
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
--error 1005
|
--error 1005
|
||||||
create table t1 (
|
create table t1 (
|
||||||
pk1 bit(9) not null primary key,
|
pk1 bit(9) not null primary key,
|
||||||
|
@ -1130,6 +1130,64 @@ END|
|
|||||||
SELECT bug12995()|
|
SELECT bug12995()|
|
||||||
delimiter ;|
|
delimiter ;|
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# BUG#12712: SET AUTOCOMMIT should fail within SP/functions/triggers
|
||||||
|
#
|
||||||
|
--disable_warnings
|
||||||
|
drop procedure if exists bug12712;
|
||||||
|
drop function if exists bug12712;
|
||||||
|
--enable_warnings
|
||||||
|
# Can...
|
||||||
|
create procedure bug12712()
|
||||||
|
set session autocommit = 0;
|
||||||
|
|
||||||
|
select @@autocommit;
|
||||||
|
set @au = @@autocommit;
|
||||||
|
call bug12712();
|
||||||
|
select @@autocommit;
|
||||||
|
set session autocommit = @au;
|
||||||
|
|
||||||
|
delimiter |;
|
||||||
|
create function bug12712()
|
||||||
|
returns int
|
||||||
|
begin
|
||||||
|
call bug12712();
|
||||||
|
return 0;
|
||||||
|
end|
|
||||||
|
|
||||||
|
# Can't...
|
||||||
|
--error ER_SP_CANT_SET_AUTOCOMMIT
|
||||||
|
set @x = bug12712()|
|
||||||
|
drop procedure bug12712|
|
||||||
|
drop function bug12712|
|
||||||
|
--error ER_SP_CANT_SET_AUTOCOMMIT
|
||||||
|
create function bug12712()
|
||||||
|
returns int
|
||||||
|
begin
|
||||||
|
set session autocommit = 0;
|
||||||
|
return 0;
|
||||||
|
end|
|
||||||
|
--error ER_SP_CANT_SET_AUTOCOMMIT
|
||||||
|
create function bug12712()
|
||||||
|
returns int
|
||||||
|
begin
|
||||||
|
set @@autocommit = 0;
|
||||||
|
return 0;
|
||||||
|
end|
|
||||||
|
--error ER_SP_CANT_SET_AUTOCOMMIT
|
||||||
|
create function bug12712()
|
||||||
|
returns int
|
||||||
|
begin
|
||||||
|
set local autocommit = 0;
|
||||||
|
return 0;
|
||||||
|
end|
|
||||||
|
delimiter ;|
|
||||||
|
--error ER_SP_CANT_SET_AUTOCOMMIT
|
||||||
|
create trigger bug12712
|
||||||
|
before insert on t1 for each row set session autocommit = 0;
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# BUG#NNNN: New bug synopsis
|
# BUG#NNNN: New bug synopsis
|
||||||
#
|
#
|
||||||
|
@ -4161,6 +4161,7 @@ drop function bug12379|
|
|||||||
drop procedure bug12379_1|
|
drop procedure bug12379_1|
|
||||||
drop procedure bug12379_2|
|
drop procedure bug12379_2|
|
||||||
drop procedure bug12379_3|
|
drop procedure bug12379_3|
|
||||||
|
drop table t3|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Bug #13124 Stored Procedure using SELECT INTO crashes server
|
# Bug #13124 Stored Procedure using SELECT INTO crashes server
|
||||||
@ -4177,6 +4178,35 @@ end|
|
|||||||
call bug13124()|
|
call bug13124()|
|
||||||
drop procedure bug13124|
|
drop procedure bug13124|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #12979 Stored procedures: crash if inout decimal parameter
|
||||||
|
#
|
||||||
|
|
||||||
|
# check NULL inout parameters processing
|
||||||
|
|
||||||
|
--disable_warnings
|
||||||
|
drop procedure if exists bug12979_1|
|
||||||
|
--enable_warnings
|
||||||
|
create procedure bug12979_1(inout d decimal(5)) set d = d / 2|
|
||||||
|
set @bug12979_user_var = NULL|
|
||||||
|
call bug12979_1(@bug12979_user_var)|
|
||||||
|
drop procedure bug12979_1|
|
||||||
|
|
||||||
|
# check NULL local variables processing
|
||||||
|
|
||||||
|
--disable_warnings
|
||||||
|
drop procedure if exists bug12979_2|
|
||||||
|
--enable_warnings
|
||||||
|
create procedure bug12979_2()
|
||||||
|
begin
|
||||||
|
declare internal_var decimal(5);
|
||||||
|
set internal_var= internal_var / 2;
|
||||||
|
select internal_var;
|
||||||
|
end|
|
||||||
|
call bug12979_2()|
|
||||||
|
drop procedure bug12979_2|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# BUG#NNNN: New bug synopsis
|
# BUG#NNNN: New bug synopsis
|
||||||
#
|
#
|
||||||
|
@ -1037,3 +1037,10 @@ call wg2()//
|
|||||||
|
|
||||||
delimiter ;//
|
delimiter ;//
|
||||||
drop procedure wg2;
|
drop procedure wg2;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #12979 Stored procedures: crash if inout decimal parameter
|
||||||
|
# (not a SP bug in fact)
|
||||||
|
#
|
||||||
|
|
||||||
|
select cast(@non_existing_user_var/2 as DECIMAL);
|
||||||
|
@ -765,7 +765,7 @@ my_decimal *Item_func_numhybrid::val_decimal(my_decimal *decimal_value)
|
|||||||
}
|
}
|
||||||
case REAL_RESULT:
|
case REAL_RESULT:
|
||||||
{
|
{
|
||||||
double result= (double)int_op();
|
double result= (double)real_op();
|
||||||
double2my_decimal(E_DEC_FATAL_ERROR, result, decimal_value);
|
double2my_decimal(E_DEC_FATAL_ERROR, result, decimal_value);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -628,7 +628,7 @@ void close_connection(THD *thd, uint errcode, bool lock);
|
|||||||
bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables,
|
bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables,
|
||||||
bool *write_to_binlog);
|
bool *write_to_binlog);
|
||||||
bool check_access(THD *thd, ulong access, const char *db, ulong *save_priv,
|
bool check_access(THD *thd, ulong access, const char *db, ulong *save_priv,
|
||||||
bool no_grant, bool no_errors);
|
bool no_grant, bool no_errors, bool schema_db);
|
||||||
bool check_table_access(THD *thd, ulong want_access, TABLE_LIST *tables,
|
bool check_table_access(THD *thd, ulong want_access, TABLE_LIST *tables,
|
||||||
bool no_errors);
|
bool no_errors);
|
||||||
bool check_global_access(THD *thd, ulong want_access);
|
bool check_global_access(THD *thd, ulong want_access);
|
||||||
@ -875,6 +875,8 @@ int fill_schema_schema_privileges(THD *thd, TABLE_LIST *tables, COND *cond);
|
|||||||
int fill_schema_table_privileges(THD *thd, TABLE_LIST *tables, COND *cond);
|
int fill_schema_table_privileges(THD *thd, TABLE_LIST *tables, COND *cond);
|
||||||
int fill_schema_column_privileges(THD *thd, TABLE_LIST *tables, COND *cond);
|
int fill_schema_column_privileges(THD *thd, TABLE_LIST *tables, COND *cond);
|
||||||
bool get_schema_tables_result(JOIN *join);
|
bool get_schema_tables_result(JOIN *join);
|
||||||
|
#define is_schema_db(X) \
|
||||||
|
!my_strcasecmp(system_charset_info, information_schema_name.str, (X))
|
||||||
|
|
||||||
/* sql_prepare.cc */
|
/* sql_prepare.cc */
|
||||||
|
|
||||||
|
@ -163,7 +163,7 @@ int register_slave(THD* thd, uchar* packet, uint packet_length)
|
|||||||
SLAVE_INFO *si;
|
SLAVE_INFO *si;
|
||||||
uchar *p= packet, *p_end= packet + packet_length;
|
uchar *p= packet, *p_end= packet + packet_length;
|
||||||
|
|
||||||
if (check_access(thd, REPL_SLAVE_ACL, any_db,0,0,0))
|
if (check_access(thd, REPL_SLAVE_ACL, any_db,0,0,0,0))
|
||||||
return 1;
|
return 1;
|
||||||
if (!(si = (SLAVE_INFO*)my_malloc(sizeof(SLAVE_INFO), MYF(MY_WME))))
|
if (!(si = (SLAVE_INFO*)my_malloc(sizeof(SLAVE_INFO), MYF(MY_WME))))
|
||||||
goto err2;
|
goto err2;
|
||||||
|
@ -449,7 +449,7 @@ sys_var_thd_date_time_format sys_datetime_format("datetime_format",
|
|||||||
|
|
||||||
/* Variables that are bits in THD */
|
/* Variables that are bits in THD */
|
||||||
|
|
||||||
static sys_var_thd_bit sys_autocommit("autocommit", 0,
|
sys_var_thd_bit sys_autocommit("autocommit", 0,
|
||||||
set_option_autocommit,
|
set_option_autocommit,
|
||||||
OPTION_NOT_AUTOCOMMIT,
|
OPTION_NOT_AUTOCOMMIT,
|
||||||
1);
|
1);
|
||||||
|
@ -906,6 +906,7 @@ extern sys_var_const_str sys_charset_system;
|
|||||||
extern sys_var_str sys_init_connect;
|
extern sys_var_str sys_init_connect;
|
||||||
extern sys_var_str sys_init_slave;
|
extern sys_var_str sys_init_slave;
|
||||||
extern sys_var_thd_time_zone sys_time_zone;
|
extern sys_var_thd_time_zone sys_time_zone;
|
||||||
|
extern sys_var_thd_bit sys_autocommit;
|
||||||
CHARSET_INFO *get_old_charset_by_name(const char *old_name);
|
CHARSET_INFO *get_old_charset_by_name(const char *old_name);
|
||||||
gptr find_named(I_List<NAMED_LIST> *list, const char *name, uint length,
|
gptr find_named(I_List<NAMED_LIST> *list, const char *name, uint length,
|
||||||
NAMED_LIST **found);
|
NAMED_LIST **found);
|
||||||
|
@ -5403,6 +5403,8 @@ ER_VIEW_PREVENT_UPDATE
|
|||||||
eng "The definition of table '%-.64s' prevents operation %s on table '%-.64s'."
|
eng "The definition of table '%-.64s' prevents operation %s on table '%-.64s'."
|
||||||
ER_PS_NO_RECURSION
|
ER_PS_NO_RECURSION
|
||||||
eng "The prepared statement contains a stored routine call that refers to that same statement. It's not allowed to execute a prepared statement in such a recursive manner"
|
eng "The prepared statement contains a stored routine call that refers to that same statement. It's not allowed to execute a prepared statement in such a recursive manner"
|
||||||
|
ER_SP_CANT_SET_AUTOCOMMIT
|
||||||
|
eng "Not allowed to set autocommit from a stored function or trigger"
|
||||||
ER_PARTITION_REQUIRES_VALUES_ERROR
|
ER_PARTITION_REQUIRES_VALUES_ERROR
|
||||||
eng "%s PARTITIONING requires definition of VALUES %s for each partition"
|
eng "%s PARTITIONING requires definition of VALUES %s for each partition"
|
||||||
swe "%s PARTITIONering kr<6B>ver definition av VALUES %s f<>r varje partition"
|
swe "%s PARTITIONering kr<6B>ver definition av VALUES %s f<>r varje partition"
|
||||||
|
@ -114,7 +114,8 @@ public:
|
|||||||
IN_HANDLER= 4, // Is set if the parser is in a handler body
|
IN_HANDLER= 4, // Is set if the parser is in a handler body
|
||||||
MULTI_RESULTS= 8, // Is set if a procedure with SELECT(s)
|
MULTI_RESULTS= 8, // Is set if a procedure with SELECT(s)
|
||||||
CONTAINS_DYNAMIC_SQL= 16, // Is set if a procedure with PREPARE/EXECUTE
|
CONTAINS_DYNAMIC_SQL= 16, // Is set if a procedure with PREPARE/EXECUTE
|
||||||
IS_INVOKED= 32 // Is set if this sp_head is being used.
|
IS_INVOKED= 32, // Is set if this sp_head is being used
|
||||||
|
HAS_SET_AUTOCOMMIT_STMT = 64 // Is set if a procedure with 'set autocommit'
|
||||||
};
|
};
|
||||||
|
|
||||||
int m_type; // TYPE_ENUM_FUNCTION or TYPE_ENUM_PROCEDURE
|
int m_type; // TYPE_ENUM_FUNCTION or TYPE_ENUM_PROCEDURE
|
||||||
@ -282,7 +283,10 @@ public:
|
|||||||
my_error(ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG, MYF(0), "Dynamic SQL");
|
my_error(ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG, MYF(0), "Dynamic SQL");
|
||||||
else if (m_flags & MULTI_RESULTS)
|
else if (m_flags & MULTI_RESULTS)
|
||||||
my_error(ER_SP_NO_RETSET, MYF(0), where);
|
my_error(ER_SP_NO_RETSET, MYF(0), where);
|
||||||
return test(m_flags & (CONTAINS_DYNAMIC_SQL|MULTI_RESULTS));
|
else if (m_flags & HAS_SET_AUTOCOMMIT_STMT)
|
||||||
|
my_error(ER_SP_CANT_SET_AUTOCOMMIT, MYF(0));
|
||||||
|
return test(m_flags &
|
||||||
|
(CONTAINS_DYNAMIC_SQL|MULTI_RESULTS|HAS_SET_AUTOCOMMIT_STMT));
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -1336,7 +1336,7 @@ bool check_change_password(THD *thd, const char *host, const char *user,
|
|||||||
(strcmp(thd->user,user) ||
|
(strcmp(thd->user,user) ||
|
||||||
my_strcasecmp(system_charset_info, host, thd->priv_host)))
|
my_strcasecmp(system_charset_info, host, thd->priv_host)))
|
||||||
{
|
{
|
||||||
if (check_access(thd, UPDATE_ACL, "mysql",0,1,0))
|
if (check_access(thd, UPDATE_ACL, "mysql",0,1,0,0))
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
if (!thd->slave_thread && !thd->user[0])
|
if (!thd->slave_thread && !thd->user[0])
|
||||||
@ -5533,7 +5533,7 @@ int fill_schema_user_privileges(THD *thd, TABLE_LIST *tables, COND *cond)
|
|||||||
ulong want_access;
|
ulong want_access;
|
||||||
char buff[100];
|
char buff[100];
|
||||||
TABLE *table= tables->table;
|
TABLE *table= tables->table;
|
||||||
bool no_global_access= check_access(thd, SELECT_ACL, "mysql",0,1,1);
|
bool no_global_access= check_access(thd, SELECT_ACL, "mysql",0,1,1,0);
|
||||||
char *curr_host= thd->priv_host ? thd->priv_host : (char *) "%";
|
char *curr_host= thd->priv_host ? thd->priv_host : (char *) "%";
|
||||||
DBUG_ENTER("fill_schema_user_privileges");
|
DBUG_ENTER("fill_schema_user_privileges");
|
||||||
|
|
||||||
@ -5586,7 +5586,7 @@ int fill_schema_schema_privileges(THD *thd, TABLE_LIST *tables, COND *cond)
|
|||||||
ulong want_access;
|
ulong want_access;
|
||||||
char buff[100];
|
char buff[100];
|
||||||
TABLE *table= tables->table;
|
TABLE *table= tables->table;
|
||||||
bool no_global_access= check_access(thd, SELECT_ACL, "mysql",0,1,1);
|
bool no_global_access= check_access(thd, SELECT_ACL, "mysql",0,1,1,0);
|
||||||
char *curr_host= thd->priv_host ? thd->priv_host : (char *) "%";
|
char *curr_host= thd->priv_host ? thd->priv_host : (char *) "%";
|
||||||
DBUG_ENTER("fill_schema_schema_privileges");
|
DBUG_ENTER("fill_schema_schema_privileges");
|
||||||
|
|
||||||
@ -5641,7 +5641,7 @@ int fill_schema_table_privileges(THD *thd, TABLE_LIST *tables, COND *cond)
|
|||||||
uint index;
|
uint index;
|
||||||
char buff[100];
|
char buff[100];
|
||||||
TABLE *table= tables->table;
|
TABLE *table= tables->table;
|
||||||
bool no_global_access= check_access(thd, SELECT_ACL, "mysql",0,1,1);
|
bool no_global_access= check_access(thd, SELECT_ACL, "mysql",0,1,1,0);
|
||||||
char *curr_host= thd->priv_host ? thd->priv_host : (char *) "%";
|
char *curr_host= thd->priv_host ? thd->priv_host : (char *) "%";
|
||||||
DBUG_ENTER("fill_schema_table_privileges");
|
DBUG_ENTER("fill_schema_table_privileges");
|
||||||
|
|
||||||
@ -5703,7 +5703,7 @@ int fill_schema_column_privileges(THD *thd, TABLE_LIST *tables, COND *cond)
|
|||||||
uint index;
|
uint index;
|
||||||
char buff[100];
|
char buff[100];
|
||||||
TABLE *table= tables->table;
|
TABLE *table= tables->table;
|
||||||
bool no_global_access= check_access(thd, SELECT_ACL, "mysql",0,1,1);
|
bool no_global_access= check_access(thd, SELECT_ACL, "mysql",0,1,1,0);
|
||||||
char *curr_host= thd->priv_host ? thd->priv_host : (char *) "%";
|
char *curr_host= thd->priv_host ? thd->priv_host : (char *) "%";
|
||||||
DBUG_ENTER("fill_schema_table_privileges");
|
DBUG_ENTER("fill_schema_table_privileges");
|
||||||
|
|
||||||
|
132
sql/sql_parse.cc
132
sql/sql_parse.cc
@ -1780,7 +1780,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
|||||||
remove_escape(table_list.table_name); // This can't have wildcards
|
remove_escape(table_list.table_name); // This can't have wildcards
|
||||||
|
|
||||||
if (check_access(thd,SELECT_ACL,table_list.db,&table_list.grant.privilege,
|
if (check_access(thd,SELECT_ACL,table_list.db,&table_list.grant.privilege,
|
||||||
0, 0))
|
0, 0, test(table_list.schema_table)))
|
||||||
break;
|
break;
|
||||||
if (grant_option &&
|
if (grant_option &&
|
||||||
check_grant(thd, SELECT_ACL, &table_list, 2, UINT_MAX, 0))
|
check_grant(thd, SELECT_ACL, &table_list, 2, UINT_MAX, 0))
|
||||||
@ -1821,7 +1821,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
|||||||
my_error(ER_WRONG_DB_NAME, MYF(0), db ? db : "NULL");
|
my_error(ER_WRONG_DB_NAME, MYF(0), db ? db : "NULL");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (check_access(thd,CREATE_ACL,db,0,1,0))
|
if (check_access(thd,CREATE_ACL,db,0,1,0,is_schema_db(db)))
|
||||||
break;
|
break;
|
||||||
mysql_log.write(thd,command,packet);
|
mysql_log.write(thd,command,packet);
|
||||||
bzero(&create_info, sizeof(create_info));
|
bzero(&create_info, sizeof(create_info));
|
||||||
@ -1840,7 +1840,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
|||||||
my_error(ER_WRONG_DB_NAME, MYF(0), db ? db : "NULL");
|
my_error(ER_WRONG_DB_NAME, MYF(0), db ? db : "NULL");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (check_access(thd,DROP_ACL,db,0,1,0))
|
if (check_access(thd,DROP_ACL,db,0,1,0,is_schema_db(db)))
|
||||||
break;
|
break;
|
||||||
if (thd->locked_tables || thd->active_transaction())
|
if (thd->locked_tables || thd->active_transaction())
|
||||||
{
|
{
|
||||||
@ -2138,7 +2138,8 @@ int prepare_schema_table(THD *thd, LEX *lex, Table_ident *table_ident,
|
|||||||
my_error(ER_WRONG_DB_NAME, MYF(0), db);
|
my_error(ER_WRONG_DB_NAME, MYF(0), db);
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
}
|
}
|
||||||
if (check_access(thd,SELECT_ACL,db,&thd->col_access,0,0))
|
if (check_access(thd, SELECT_ACL, db, &thd->col_access, 0, 0,
|
||||||
|
is_schema_db(db)))
|
||||||
DBUG_RETURN(1); /* purecov: inspected */
|
DBUG_RETURN(1); /* purecov: inspected */
|
||||||
if (!thd->col_access && check_grant_db(thd,db))
|
if (!thd->col_access && check_grant_db(thd,db))
|
||||||
{
|
{
|
||||||
@ -2177,7 +2178,8 @@ int prepare_schema_table(THD *thd, LEX *lex, Table_ident *table_ident,
|
|||||||
remove_escape(db); // Fix escaped '_'
|
remove_escape(db); // Fix escaped '_'
|
||||||
remove_escape(table_list->table_name);
|
remove_escape(table_list->table_name);
|
||||||
if (check_access(thd,SELECT_ACL | EXTRA_ACL,db,
|
if (check_access(thd,SELECT_ACL | EXTRA_ACL,db,
|
||||||
&table_list->grant.privilege, 0, 0))
|
&table_list->grant.privilege, 0, 0,
|
||||||
|
test(table_list->schema_table)))
|
||||||
DBUG_RETURN(1); /* purecov: inspected */
|
DBUG_RETURN(1); /* purecov: inspected */
|
||||||
if (grant_option && check_grant(thd, SELECT_ACL, table_list, 2,
|
if (grant_option && check_grant(thd, SELECT_ACL, table_list, 2,
|
||||||
UINT_MAX, 0))
|
UINT_MAX, 0))
|
||||||
@ -2434,7 +2436,7 @@ mysql_execute_command(THD *thd)
|
|||||||
else
|
else
|
||||||
res= check_access(thd,
|
res= check_access(thd,
|
||||||
lex->exchange ? SELECT_ACL | FILE_ACL : SELECT_ACL,
|
lex->exchange ? SELECT_ACL | FILE_ACL : SELECT_ACL,
|
||||||
any_db, 0, 0, 0);
|
any_db, 0, 0, 0, 0);
|
||||||
if (res)
|
if (res)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
@ -2616,7 +2618,8 @@ mysql_execute_command(THD *thd)
|
|||||||
DBUG_ASSERT(first_table == all_tables && first_table != 0);
|
DBUG_ASSERT(first_table == all_tables && first_table != 0);
|
||||||
if (check_db_used(thd, all_tables) ||
|
if (check_db_used(thd, all_tables) ||
|
||||||
check_access(thd, INDEX_ACL, first_table->db,
|
check_access(thd, INDEX_ACL, first_table->db,
|
||||||
&first_table->grant.privilege, 0, 0))
|
&first_table->grant.privilege, 0, 0,
|
||||||
|
test(first_table->schema_table)))
|
||||||
goto error;
|
goto error;
|
||||||
res= mysql_assign_to_keycache(thd, first_table, &lex->ident);
|
res= mysql_assign_to_keycache(thd, first_table, &lex->ident);
|
||||||
break;
|
break;
|
||||||
@ -2626,7 +2629,8 @@ mysql_execute_command(THD *thd)
|
|||||||
DBUG_ASSERT(first_table == all_tables && first_table != 0);
|
DBUG_ASSERT(first_table == all_tables && first_table != 0);
|
||||||
if (check_db_used(thd, all_tables) ||
|
if (check_db_used(thd, all_tables) ||
|
||||||
check_access(thd, INDEX_ACL, first_table->db,
|
check_access(thd, INDEX_ACL, first_table->db,
|
||||||
&first_table->grant.privilege, 0, 0))
|
&first_table->grant.privilege, 0, 0,
|
||||||
|
test(first_table->schema_table)))
|
||||||
goto error;
|
goto error;
|
||||||
res = mysql_preload_keys(thd, first_table);
|
res = mysql_preload_keys(thd, first_table);
|
||||||
break;
|
break;
|
||||||
@ -2692,7 +2696,8 @@ mysql_execute_command(THD *thd)
|
|||||||
if (!first_table->db)
|
if (!first_table->db)
|
||||||
first_table->db= thd->db;
|
first_table->db= thd->db;
|
||||||
if (check_access(thd, CREATE_ACL, first_table->db,
|
if (check_access(thd, CREATE_ACL, first_table->db,
|
||||||
&first_table->grant.privilege, 0, 0))
|
&first_table->grant.privilege, 0, 0,
|
||||||
|
test(first_table->schema_table)))
|
||||||
goto error; /* purecov: inspected */
|
goto error; /* purecov: inspected */
|
||||||
if (grant_option)
|
if (grant_option)
|
||||||
{
|
{
|
||||||
@ -2957,8 +2962,10 @@ end_with_restore_list:
|
|||||||
select_lex->db= first_table->db;
|
select_lex->db= first_table->db;
|
||||||
}
|
}
|
||||||
if (check_access(thd, ALTER_ACL, first_table->db,
|
if (check_access(thd, ALTER_ACL, first_table->db,
|
||||||
&first_table->grant.privilege, 0, 0) ||
|
&first_table->grant.privilege, 0, 0,
|
||||||
check_access(thd,INSERT_ACL | CREATE_ACL,select_lex->db,&priv,0,0)||
|
test(first_table->schema_table)) ||
|
||||||
|
check_access(thd,INSERT_ACL | CREATE_ACL,select_lex->db,&priv,0,0,
|
||||||
|
is_schema_db(select_lex->db))||
|
||||||
check_merge_table_access(thd, first_table->db,
|
check_merge_table_access(thd, first_table->db,
|
||||||
(TABLE_LIST *)
|
(TABLE_LIST *)
|
||||||
lex->create_info.merge_list.first))
|
lex->create_info.merge_list.first))
|
||||||
@ -3008,9 +3015,10 @@ end_with_restore_list:
|
|||||||
for (table= first_table; table; table= table->next_local->next_local)
|
for (table= first_table; table; table= table->next_local->next_local)
|
||||||
{
|
{
|
||||||
if (check_access(thd, ALTER_ACL | DROP_ACL, table->db,
|
if (check_access(thd, ALTER_ACL | DROP_ACL, table->db,
|
||||||
&table->grant.privilege,0,0) ||
|
&table->grant.privilege,0,0, test(table->schema_table)) ||
|
||||||
check_access(thd, INSERT_ACL | CREATE_ACL, table->next_local->db,
|
check_access(thd, INSERT_ACL | CREATE_ACL, table->next_local->db,
|
||||||
&table->next_local->grant.privilege, 0, 0))
|
&table->next_local->grant.privilege, 0, 0,
|
||||||
|
test(table->next_local->schema_table)))
|
||||||
goto error;
|
goto error;
|
||||||
if (grant_option)
|
if (grant_option)
|
||||||
{
|
{
|
||||||
@ -3062,7 +3070,8 @@ end_with_restore_list:
|
|||||||
|
|
||||||
if (check_db_used(thd, all_tables) ||
|
if (check_db_used(thd, all_tables) ||
|
||||||
check_access(thd, SELECT_ACL | EXTRA_ACL, first_table->db,
|
check_access(thd, SELECT_ACL | EXTRA_ACL, first_table->db,
|
||||||
&first_table->grant.privilege, 0, 0))
|
&first_table->grant.privilege, 0, 0,
|
||||||
|
test(first_table->schema_table)))
|
||||||
goto error;
|
goto error;
|
||||||
if (grant_option && check_grant(thd, SELECT_ACL, all_tables, 2, UINT_MAX, 0))
|
if (grant_option && check_grant(thd, SELECT_ACL, all_tables, 2, UINT_MAX, 0))
|
||||||
goto error;
|
goto error;
|
||||||
@ -3394,7 +3403,7 @@ end_with_restore_list:
|
|||||||
goto error;
|
goto error;
|
||||||
#else
|
#else
|
||||||
{
|
{
|
||||||
if (grant_option && check_access(thd, FILE_ACL, any_db,0,0,0))
|
if (grant_option && check_access(thd, FILE_ACL, any_db,0,0,0,0))
|
||||||
goto error;
|
goto error;
|
||||||
res= mysqld_show_logs(thd);
|
res= mysqld_show_logs(thd);
|
||||||
break;
|
break;
|
||||||
@ -3523,7 +3532,7 @@ end_with_restore_list:
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (check_access(thd,CREATE_ACL,lex->name,0,1,0))
|
if (check_access(thd,CREATE_ACL,lex->name,0,1,0,is_schema_db(lex->name)))
|
||||||
break;
|
break;
|
||||||
res= mysql_create_db(thd,(lower_case_table_names == 2 ? alias : lex->name),
|
res= mysql_create_db(thd,(lower_case_table_names == 2 ? alias : lex->name),
|
||||||
&lex->create_info, 0);
|
&lex->create_info, 0);
|
||||||
@ -3557,7 +3566,7 @@ end_with_restore_list:
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (check_access(thd,DROP_ACL,lex->name,0,1,0))
|
if (check_access(thd,DROP_ACL,lex->name,0,1,0,is_schema_db(lex->name)))
|
||||||
break;
|
break;
|
||||||
if (thd->locked_tables || thd->active_transaction())
|
if (thd->locked_tables || thd->active_transaction())
|
||||||
{
|
{
|
||||||
@ -3597,7 +3606,7 @@ end_with_restore_list:
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (check_access(thd, ALTER_ACL, db, 0, 1, 0))
|
if (check_access(thd, ALTER_ACL, db, 0, 1, 0, is_schema_db(db)))
|
||||||
break;
|
break;
|
||||||
if (thd->locked_tables || thd->active_transaction())
|
if (thd->locked_tables || thd->active_transaction())
|
||||||
{
|
{
|
||||||
@ -3615,14 +3624,14 @@ end_with_restore_list:
|
|||||||
my_error(ER_WRONG_DB_NAME, MYF(0), lex->name);
|
my_error(ER_WRONG_DB_NAME, MYF(0), lex->name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (check_access(thd,SELECT_ACL,lex->name,0,1,0))
|
if (check_access(thd,SELECT_ACL,lex->name,0,1,0,is_schema_db(lex->name)))
|
||||||
break;
|
break;
|
||||||
res=mysqld_show_create_db(thd,lex->name,&lex->create_info);
|
res=mysqld_show_create_db(thd,lex->name,&lex->create_info);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SQLCOM_CREATE_FUNCTION: // UDF function
|
case SQLCOM_CREATE_FUNCTION: // UDF function
|
||||||
{
|
{
|
||||||
if (check_access(thd,INSERT_ACL,"mysql",0,1,0))
|
if (check_access(thd,INSERT_ACL,"mysql",0,1,0,0))
|
||||||
break;
|
break;
|
||||||
#ifdef HAVE_DLOPEN
|
#ifdef HAVE_DLOPEN
|
||||||
if (sp_find_function(thd, lex->spname))
|
if (sp_find_function(thd, lex->spname))
|
||||||
@ -3641,7 +3650,7 @@ end_with_restore_list:
|
|||||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||||
case SQLCOM_CREATE_USER:
|
case SQLCOM_CREATE_USER:
|
||||||
{
|
{
|
||||||
if (check_access(thd, INSERT_ACL, "mysql", 0, 1, 1) &&
|
if (check_access(thd, INSERT_ACL, "mysql", 0, 1, 1, 0) &&
|
||||||
check_global_access(thd,CREATE_USER_ACL))
|
check_global_access(thd,CREATE_USER_ACL))
|
||||||
break;
|
break;
|
||||||
if (!(res= mysql_create_user(thd, lex->users_list)))
|
if (!(res= mysql_create_user(thd, lex->users_list)))
|
||||||
@ -3657,7 +3666,7 @@ end_with_restore_list:
|
|||||||
}
|
}
|
||||||
case SQLCOM_DROP_USER:
|
case SQLCOM_DROP_USER:
|
||||||
{
|
{
|
||||||
if (check_access(thd, DELETE_ACL, "mysql", 0, 1, 1) &&
|
if (check_access(thd, DELETE_ACL, "mysql", 0, 1, 1, 0) &&
|
||||||
check_global_access(thd,CREATE_USER_ACL))
|
check_global_access(thd,CREATE_USER_ACL))
|
||||||
break;
|
break;
|
||||||
if (!(res= mysql_drop_user(thd, lex->users_list)))
|
if (!(res= mysql_drop_user(thd, lex->users_list)))
|
||||||
@ -3673,7 +3682,7 @@ end_with_restore_list:
|
|||||||
}
|
}
|
||||||
case SQLCOM_RENAME_USER:
|
case SQLCOM_RENAME_USER:
|
||||||
{
|
{
|
||||||
if (check_access(thd, UPDATE_ACL, "mysql", 0, 1, 1) &&
|
if (check_access(thd, UPDATE_ACL, "mysql", 0, 1, 1, 0) &&
|
||||||
check_global_access(thd,CREATE_USER_ACL))
|
check_global_access(thd,CREATE_USER_ACL))
|
||||||
break;
|
break;
|
||||||
if (!(res= mysql_rename_user(thd, lex->users_list)))
|
if (!(res= mysql_rename_user(thd, lex->users_list)))
|
||||||
@ -3689,7 +3698,7 @@ end_with_restore_list:
|
|||||||
}
|
}
|
||||||
case SQLCOM_REVOKE_ALL:
|
case SQLCOM_REVOKE_ALL:
|
||||||
{
|
{
|
||||||
if (check_access(thd, UPDATE_ACL, "mysql", 0, 1, 1) &&
|
if (check_access(thd, UPDATE_ACL, "mysql", 0, 1, 1, 0) &&
|
||||||
check_global_access(thd,CREATE_USER_ACL))
|
check_global_access(thd,CREATE_USER_ACL))
|
||||||
break;
|
break;
|
||||||
if (!(res = mysql_revoke_all(thd, lex->users_list)))
|
if (!(res = mysql_revoke_all(thd, lex->users_list)))
|
||||||
@ -3709,7 +3718,9 @@ end_with_restore_list:
|
|||||||
if (check_access(thd, lex->grant | lex->grant_tot_col | GRANT_ACL,
|
if (check_access(thd, lex->grant | lex->grant_tot_col | GRANT_ACL,
|
||||||
first_table ? first_table->db : select_lex->db,
|
first_table ? first_table->db : select_lex->db,
|
||||||
first_table ? &first_table->grant.privilege : 0,
|
first_table ? &first_table->grant.privilege : 0,
|
||||||
first_table ? 0 : 1, 0))
|
first_table ? 0 : 1, 0,
|
||||||
|
first_table ? (bool) first_table->schema_table :
|
||||||
|
select_lex->db ? is_schema_db(select_lex->db) : 0))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
if (thd->user) // If not replication
|
if (thd->user) // If not replication
|
||||||
@ -3734,7 +3745,7 @@ end_with_restore_list:
|
|||||||
{
|
{
|
||||||
// TODO: use check_change_password()
|
// TODO: use check_change_password()
|
||||||
if (check_acl_user(user, &counter) && user->password.str &&
|
if (check_acl_user(user, &counter) && user->password.str &&
|
||||||
check_access(thd, UPDATE_ACL,"mysql",0,1,1))
|
check_access(thd, UPDATE_ACL,"mysql",0,1,1,0))
|
||||||
{
|
{
|
||||||
my_message(ER_PASSWORD_NOT_ALLOWED,
|
my_message(ER_PASSWORD_NOT_ALLOWED,
|
||||||
ER(ER_PASSWORD_NOT_ALLOWED), MYF(0));
|
ER(ER_PASSWORD_NOT_ALLOWED), MYF(0));
|
||||||
@ -3859,7 +3870,7 @@ end_with_restore_list:
|
|||||||
case SQLCOM_SHOW_GRANTS:
|
case SQLCOM_SHOW_GRANTS:
|
||||||
if ((thd->priv_user &&
|
if ((thd->priv_user &&
|
||||||
!strcmp(thd->priv_user,lex->grant_user->user.str)) ||
|
!strcmp(thd->priv_user,lex->grant_user->user.str)) ||
|
||||||
!check_access(thd, SELECT_ACL, "mysql",0,1,0))
|
!check_access(thd, SELECT_ACL, "mysql",0,1,0,0))
|
||||||
{
|
{
|
||||||
res = mysql_show_grants(thd,lex->grant_user);
|
res = mysql_show_grants(thd,lex->grant_user);
|
||||||
}
|
}
|
||||||
@ -4014,7 +4025,8 @@ end_with_restore_list:
|
|||||||
|
|
||||||
DBUG_ASSERT(lex->sphead != 0);
|
DBUG_ASSERT(lex->sphead != 0);
|
||||||
|
|
||||||
if (check_access(thd, CREATE_PROC_ACL, lex->sphead->m_db.str, 0, 0, 0))
|
if (check_access(thd, CREATE_PROC_ACL, lex->sphead->m_db.str, 0, 0, 0,
|
||||||
|
is_schema_db(lex->sphead->m_db.str)))
|
||||||
{
|
{
|
||||||
delete lex->sphead;
|
delete lex->sphead;
|
||||||
lex->sphead= 0;
|
lex->sphead= 0;
|
||||||
@ -4358,7 +4370,7 @@ end_with_restore_list:
|
|||||||
lex->spname->m_name.length);
|
lex->spname->m_name.length);
|
||||||
if (udf)
|
if (udf)
|
||||||
{
|
{
|
||||||
if (check_access(thd, DELETE_ACL, "mysql", 0, 1, 0))
|
if (check_access(thd, DELETE_ACL, "mysql", 0, 1, 0, 0))
|
||||||
goto error;
|
goto error;
|
||||||
if (!(res = mysql_drop_function(thd, &lex->spname->m_name)))
|
if (!(res = mysql_drop_function(thd, &lex->spname->m_name)))
|
||||||
{
|
{
|
||||||
@ -4723,7 +4735,8 @@ cleanup:
|
|||||||
bool check_one_table_access(THD *thd, ulong privilege, TABLE_LIST *all_tables)
|
bool check_one_table_access(THD *thd, ulong privilege, TABLE_LIST *all_tables)
|
||||||
{
|
{
|
||||||
if (check_access(thd, privilege, all_tables->db,
|
if (check_access(thd, privilege, all_tables->db,
|
||||||
&all_tables->grant.privilege, 0, 0))
|
&all_tables->grant.privilege, 0, 0,
|
||||||
|
test(all_tables->schema_table)))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/* Show only 1 table for check_grant */
|
/* Show only 1 table for check_grant */
|
||||||
@ -4762,13 +4775,14 @@ bool check_one_table_access(THD *thd, ulong privilege, TABLE_LIST *all_tables)
|
|||||||
|
|
||||||
bool
|
bool
|
||||||
check_access(THD *thd, ulong want_access, const char *db, ulong *save_priv,
|
check_access(THD *thd, ulong want_access, const char *db, ulong *save_priv,
|
||||||
bool dont_check_global_grants, bool no_errors)
|
bool dont_check_global_grants, bool no_errors, bool schema_db)
|
||||||
{
|
{
|
||||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||||
ulong db_access;
|
ulong db_access;
|
||||||
bool db_is_pattern= test(want_access & GRANT_ACL);
|
bool db_is_pattern= test(want_access & GRANT_ACL);
|
||||||
#endif
|
#endif
|
||||||
ulong dummy;
|
ulong dummy;
|
||||||
|
const char *db_name;
|
||||||
DBUG_ENTER("check_access");
|
DBUG_ENTER("check_access");
|
||||||
DBUG_PRINT("enter",("db: %s want_access: %lu master_access: %lu",
|
DBUG_PRINT("enter",("db: %s want_access: %lu master_access: %lu",
|
||||||
db ? db : "", want_access, thd->master_access));
|
db ? db : "", want_access, thd->master_access));
|
||||||
@ -4786,6 +4800,23 @@ check_access(THD *thd, ulong want_access, const char *db, ulong *save_priv,
|
|||||||
DBUG_RETURN(TRUE); /* purecov: tested */
|
DBUG_RETURN(TRUE); /* purecov: tested */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
db_name= db ? db : thd->db;
|
||||||
|
if (schema_db)
|
||||||
|
{
|
||||||
|
if (want_access & ~(SELECT_ACL | EXTRA_ACL))
|
||||||
|
{
|
||||||
|
if (!no_errors)
|
||||||
|
my_error(ER_DBACCESS_DENIED_ERROR, MYF(0),
|
||||||
|
thd->priv_user, thd->priv_host, db_name);
|
||||||
|
DBUG_RETURN(TRUE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*save_priv= SELECT_ACL;
|
||||||
|
DBUG_RETURN(FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef NO_EMBEDDED_ACCESS_CHECKS
|
#ifdef NO_EMBEDDED_ACCESS_CHECKS
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
#else
|
#else
|
||||||
@ -4898,6 +4929,15 @@ check_table_access(THD *thd, ulong want_access,TABLE_LIST *tables,
|
|||||||
TABLE_LIST *org_tables=tables;
|
TABLE_LIST *org_tables=tables;
|
||||||
for (; tables; tables= tables->next_global)
|
for (; tables; tables= tables->next_global)
|
||||||
{
|
{
|
||||||
|
if (tables->schema_table &&
|
||||||
|
(want_access & ~(SELECT_ACL | EXTRA_ACL)))
|
||||||
|
{
|
||||||
|
if (!no_errors)
|
||||||
|
my_error(ER_DBACCESS_DENIED_ERROR, MYF(0),
|
||||||
|
thd->priv_user, thd->priv_host,
|
||||||
|
information_schema_name.str);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
if (tables->derived || tables->schema_table || tables->belong_to_view ||
|
if (tables->derived || tables->schema_table || tables->belong_to_view ||
|
||||||
(tables->table && (int)tables->table->s->tmp_table) ||
|
(tables->table && (int)tables->table->s->tmp_table) ||
|
||||||
my_tz_check_n_skip_implicit_tables(&tables,
|
my_tz_check_n_skip_implicit_tables(&tables,
|
||||||
@ -4913,14 +4953,14 @@ check_table_access(THD *thd, ulong want_access,TABLE_LIST *tables,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (check_access(thd,want_access,tables->db,&tables->grant.privilege,
|
if (check_access(thd,want_access,tables->db,&tables->grant.privilege,
|
||||||
0, no_errors))
|
0, no_errors, test(tables->schema_table)))
|
||||||
return TRUE; // Access denied
|
return TRUE; // Access denied
|
||||||
found_access=tables->grant.privilege;
|
found_access=tables->grant.privilege;
|
||||||
found=1;
|
found=1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (check_access(thd,want_access,tables->db,&tables->grant.privilege,
|
else if (check_access(thd,want_access,tables->db,&tables->grant.privilege,
|
||||||
0, no_errors))
|
0, no_errors, test(tables->schema_table)))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
if (grant_option)
|
if (grant_option)
|
||||||
@ -4943,7 +4983,7 @@ check_routine_access(THD *thd, ulong want_access,char *db, char *name,
|
|||||||
if ((thd->master_access & want_access) == want_access && !thd->db)
|
if ((thd->master_access & want_access) == want_access && !thd->db)
|
||||||
tables->grant.privilege= want_access;
|
tables->grant.privilege= want_access;
|
||||||
else if (check_access(thd,want_access,db,&tables->grant.privilege,
|
else if (check_access(thd,want_access,db,&tables->grant.privilege,
|
||||||
0, no_errors))
|
0, no_errors, test(tables->schema_table)))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||||
@ -4975,7 +5015,11 @@ bool check_some_routine_access(THD *thd, const char *db, const char *name,
|
|||||||
ulong save_priv;
|
ulong save_priv;
|
||||||
if (thd->master_access & SHOW_PROC_ACLS)
|
if (thd->master_access & SHOW_PROC_ACLS)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if (!check_access(thd, SHOW_PROC_ACLS, db, &save_priv, 0, 1) ||
|
/*
|
||||||
|
There are no routines in information_schema db. So we can safely
|
||||||
|
pass zero to last paramter of check_access function
|
||||||
|
*/
|
||||||
|
if (!check_access(thd, SHOW_PROC_ACLS, db, &save_priv, 0, 1, 0) ||
|
||||||
(save_priv & SHOW_PROC_ACLS))
|
(save_priv & SHOW_PROC_ACLS))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
return check_routine_level_acl(thd, db, name, is_proc);
|
return check_routine_level_acl(thd, db, name, is_proc);
|
||||||
@ -5007,7 +5051,8 @@ bool check_some_access(THD *thd, ulong want_access, TABLE_LIST *table)
|
|||||||
if (access & want_access)
|
if (access & want_access)
|
||||||
{
|
{
|
||||||
if (!check_access(thd, access, table->db,
|
if (!check_access(thd, access, table->db,
|
||||||
&table->grant.privilege, 0, 1) &&
|
&table->grant.privilege, 0, 1,
|
||||||
|
test(table->schema_table)) &&
|
||||||
!grant_option || !check_grant(thd, access, table, 0, 1, 1))
|
!grant_option || !check_grant(thd, access, table, 0, 1, 1))
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
@ -6815,7 +6860,8 @@ static bool check_multi_update_lock(THD *thd)
|
|||||||
{
|
{
|
||||||
TABLE_LIST *save= table->next_local;
|
TABLE_LIST *save= table->next_local;
|
||||||
table->next_local= 0;
|
table->next_local= 0;
|
||||||
if ((check_access(thd, UPDATE_ACL, table->db, &table->grant.privilege,0,1) ||
|
if ((check_access(thd, UPDATE_ACL, table->db,
|
||||||
|
&table->grant.privilege,0,1, test(table->schema_table)) ||
|
||||||
(grant_option && check_grant(thd, UPDATE_ACL, table,0,1,1))) &&
|
(grant_option && check_grant(thd, UPDATE_ACL, table,0,1,1))) &&
|
||||||
check_one_table_access(thd, SELECT_ACL, table))
|
check_one_table_access(thd, SELECT_ACL, table))
|
||||||
goto error;
|
goto error;
|
||||||
@ -6983,11 +7029,13 @@ bool multi_update_precheck(THD *thd, TABLE_LIST *tables)
|
|||||||
if (table->derived)
|
if (table->derived)
|
||||||
table->grant.privilege= SELECT_ACL;
|
table->grant.privilege= SELECT_ACL;
|
||||||
else if ((check_access(thd, UPDATE_ACL, table->db,
|
else if ((check_access(thd, UPDATE_ACL, table->db,
|
||||||
&table->grant.privilege, 0, 1) ||
|
&table->grant.privilege, 0, 1,
|
||||||
|
test(table->schema_table)) ||
|
||||||
grant_option &&
|
grant_option &&
|
||||||
check_grant(thd, UPDATE_ACL, table, 0, 1, 1)) &&
|
check_grant(thd, UPDATE_ACL, table, 0, 1, 1)) &&
|
||||||
(check_access(thd, SELECT_ACL, table->db,
|
(check_access(thd, SELECT_ACL, table->db,
|
||||||
&table->grant.privilege, 0, 0) ||
|
&table->grant.privilege, 0, 0,
|
||||||
|
test(table->schema_table)) ||
|
||||||
grant_option && check_grant(thd, SELECT_ACL, table, 0, 1, 0)))
|
grant_option && check_grant(thd, SELECT_ACL, table, 0, 1, 0)))
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
|
|
||||||
@ -7006,7 +7054,8 @@ bool multi_update_precheck(THD *thd, TABLE_LIST *tables)
|
|||||||
!table->table_in_first_from_clause)
|
!table->table_in_first_from_clause)
|
||||||
{
|
{
|
||||||
if (check_access(thd, SELECT_ACL, table->db,
|
if (check_access(thd, SELECT_ACL, table->db,
|
||||||
&table->grant.privilege, 0, 0) ||
|
&table->grant.privilege, 0, 0,
|
||||||
|
test(table->schema_table)) ||
|
||||||
grant_option && check_grant(thd, SELECT_ACL, table, 0, 1, 0))
|
grant_option && check_grant(thd, SELECT_ACL, table, 0, 1, 0))
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
}
|
}
|
||||||
@ -7223,7 +7272,8 @@ bool create_table_precheck(THD *thd, TABLE_LIST *tables,
|
|||||||
CREATE_TMP_ACL : CREATE_ACL);
|
CREATE_TMP_ACL : CREATE_ACL);
|
||||||
lex->create_info.alias= create_table->alias;
|
lex->create_info.alias= create_table->alias;
|
||||||
if (check_access(thd, want_priv, create_table->db,
|
if (check_access(thd, want_priv, create_table->db,
|
||||||
&create_table->grant.privilege, 0, 0) ||
|
&create_table->grant.privilege, 0, 0,
|
||||||
|
test(create_table->schema_table)) ||
|
||||||
check_merge_table_access(thd, create_table->db,
|
check_merge_table_access(thd, create_table->db,
|
||||||
(TABLE_LIST *)
|
(TABLE_LIST *)
|
||||||
lex->create_info.merge_list.first))
|
lex->create_info.merge_list.first))
|
||||||
|
@ -1235,7 +1235,7 @@ static int mysql_test_select(Prepared_statement *stmt,
|
|||||||
if (check_table_access(thd, privilege, tables,0))
|
if (check_table_access(thd, privilege, tables,0))
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
else if (check_access(thd, privilege, any_db,0,0,0))
|
else if (check_access(thd, privilege, any_db,0,0,0,0))
|
||||||
goto error;
|
goto error;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -770,7 +770,7 @@ int start_slave(THD* thd , MASTER_INFO* mi, bool net_report)
|
|||||||
int thread_mask;
|
int thread_mask;
|
||||||
DBUG_ENTER("start_slave");
|
DBUG_ENTER("start_slave");
|
||||||
|
|
||||||
if (check_access(thd, SUPER_ACL, any_db,0,0,0))
|
if (check_access(thd, SUPER_ACL, any_db,0,0,0,0))
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
lock_slave_threads(mi); // this allows us to cleanly read slave_running
|
lock_slave_threads(mi); // this allows us to cleanly read slave_running
|
||||||
// Get a mask of _stopped_ threads
|
// Get a mask of _stopped_ threads
|
||||||
@ -895,7 +895,7 @@ int stop_slave(THD* thd, MASTER_INFO* mi, bool net_report )
|
|||||||
if (!thd)
|
if (!thd)
|
||||||
thd = current_thd;
|
thd = current_thd;
|
||||||
|
|
||||||
if (check_access(thd, SUPER_ACL, any_db,0,0,0))
|
if (check_access(thd, SUPER_ACL, any_db,0,0,0,0))
|
||||||
return 1;
|
return 1;
|
||||||
thd->proc_info = "Killing slave";
|
thd->proc_info = "Killing slave";
|
||||||
int thread_mask;
|
int thread_mask;
|
||||||
|
@ -2063,8 +2063,8 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
|
|||||||
(base_name= select_lex->db) && !bases.elements))
|
(base_name= select_lex->db) && !bases.elements))
|
||||||
{
|
{
|
||||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||||
if (with_i_schema || // don't check the rights if information schema db
|
if (!check_access(thd,SELECT_ACL, base_name,
|
||||||
!check_access(thd,SELECT_ACL, base_name, &thd->col_access,0,1) ||
|
&thd->col_access, 0, 1, with_i_schema) ||
|
||||||
thd->master_access & (DB_ACLS | SHOW_DB_ACL) ||
|
thd->master_access & (DB_ACLS | SHOW_DB_ACL) ||
|
||||||
acl_get(thd->host, thd->ip, thd->priv_user, base_name,0) ||
|
acl_get(thd->host, thd->ip, thd->priv_user, base_name,0) ||
|
||||||
(grant_option && !check_grant_db(thd, base_name)))
|
(grant_option && !check_grant_db(thd, base_name)))
|
||||||
@ -2486,7 +2486,7 @@ static int get_schema_column_record(THD *thd, struct st_table_list *tables,
|
|||||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||||
uint col_access;
|
uint col_access;
|
||||||
check_access(thd,SELECT_ACL | EXTRA_ACL, base_name,
|
check_access(thd,SELECT_ACL | EXTRA_ACL, base_name,
|
||||||
&tables->grant.privilege, 0, 0);
|
&tables->grant.privilege, 0, 0, test(tables->schema_table));
|
||||||
col_access= get_column_grant(thd, &tables->grant,
|
col_access= get_column_grant(thd, &tables->grant,
|
||||||
base_name, file_name,
|
base_name, file_name,
|
||||||
field->field_name) & COL_ACLS;
|
field->field_name) & COL_ACLS;
|
||||||
@ -2502,11 +2502,6 @@ static int get_schema_column_record(THD *thd, struct st_table_list *tables,
|
|||||||
end=strmov(end,grant_types.type_names[bitnr]);
|
end=strmov(end,grant_types.type_names[bitnr]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (tables->schema_table) // any user has 'select' privilege on all
|
|
||||||
// I_S table columns
|
|
||||||
table->field[17]->store(grant_types.type_names[0],
|
|
||||||
strlen(grant_types.type_names[0]), cs);
|
|
||||||
else
|
|
||||||
table->field[17]->store(tmp+1,end == tmp ? 0 : (uint) (end-tmp-1), cs);
|
table->field[17]->store(tmp+1,end == tmp ? 0 : (uint) (end-tmp-1), cs);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -825,7 +825,8 @@ bool mysql_multi_update_prepare(THD *thd)
|
|||||||
{
|
{
|
||||||
uint want_privilege= tl->updating ? UPDATE_ACL : SELECT_ACL;
|
uint want_privilege= tl->updating ? UPDATE_ACL : SELECT_ACL;
|
||||||
if (check_access(thd, want_privilege,
|
if (check_access(thd, want_privilege,
|
||||||
tl->db, &tl->grant.privilege, 0, 0) ||
|
tl->db, &tl->grant.privilege, 0, 0,
|
||||||
|
test(tl->schema_table)) ||
|
||||||
(grant_option && check_grant(thd, want_privilege, tl, 0, 1, 0)))
|
(grant_option && check_grant(thd, want_privilege, tl, 0, 1, 0)))
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
}
|
}
|
||||||
|
@ -224,11 +224,11 @@ bool mysql_create_view(THD *thd,
|
|||||||
table (i.e. user will not get some privileges by view creation)
|
table (i.e. user will not get some privileges by view creation)
|
||||||
*/
|
*/
|
||||||
if ((check_access(thd, CREATE_VIEW_ACL, view->db, &view->grant.privilege,
|
if ((check_access(thd, CREATE_VIEW_ACL, view->db, &view->grant.privilege,
|
||||||
0, 0) ||
|
0, 0, is_schema_db(view->db)) ||
|
||||||
grant_option && check_grant(thd, CREATE_VIEW_ACL, view, 0, 1, 0)) ||
|
grant_option && check_grant(thd, CREATE_VIEW_ACL, view, 0, 1, 0)) ||
|
||||||
(mode != VIEW_CREATE_NEW &&
|
(mode != VIEW_CREATE_NEW &&
|
||||||
(check_access(thd, DROP_ACL, view->db, &view->grant.privilege,
|
(check_access(thd, DROP_ACL, view->db, &view->grant.privilege,
|
||||||
0, 0) ||
|
0, 0, is_schema_db(view->db)) ||
|
||||||
grant_option && check_grant(thd, DROP_ACL, view, 0, 1, 0))))
|
grant_option && check_grant(thd, DROP_ACL, view, 0, 1, 0))))
|
||||||
{
|
{
|
||||||
res= TRUE;
|
res= TRUE;
|
||||||
@ -280,7 +280,7 @@ bool mysql_create_view(THD *thd,
|
|||||||
if (!tbl->table_in_first_from_clause)
|
if (!tbl->table_in_first_from_clause)
|
||||||
{
|
{
|
||||||
if (check_access(thd, SELECT_ACL, tbl->db,
|
if (check_access(thd, SELECT_ACL, tbl->db,
|
||||||
&tbl->grant.privilege, 0, 0) ||
|
&tbl->grant.privilege, 0, 0, test(tbl->schema_table)) ||
|
||||||
grant_option && check_grant(thd, SELECT_ACL, tbl, 0, 1, 0))
|
grant_option && check_grant(thd, SELECT_ACL, tbl, 0, 1, 0))
|
||||||
{
|
{
|
||||||
res= TRUE;
|
res= TRUE;
|
||||||
|
@ -8603,6 +8603,14 @@ internal_variable_name:
|
|||||||
if (tmp == &sys_time_zone &&
|
if (tmp == &sys_time_zone &&
|
||||||
lex->add_time_zone_tables_to_query_tables(YYTHD))
|
lex->add_time_zone_tables_to_query_tables(YYTHD))
|
||||||
YYABORT;
|
YYABORT;
|
||||||
|
else if (spc && tmp == &sys_autocommit)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
We don't allow setting AUTOCOMMIT from a stored function
|
||||||
|
or trigger.
|
||||||
|
*/
|
||||||
|
lex->sphead->m_flags|= sp_head::HAS_SET_AUTOCOMMIT_STMT;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -288,6 +288,8 @@ int openfrm(THD *thd, const char *name, const char *alias, uint db_stat,
|
|||||||
keynames=(char*) key_part;
|
keynames=(char*) key_part;
|
||||||
strpos+= (strmov(keynames, (char *) strpos) - keynames)+1;
|
strpos+= (strmov(keynames, (char *) strpos) - keynames)+1;
|
||||||
|
|
||||||
|
share->null_bytes= (null_pos-(uchar*)outparam->null_flags + (null_bit_pos + 7) / 8);
|
||||||
|
|
||||||
share->reclength = uint2korr((head+16));
|
share->reclength = uint2korr((head+16));
|
||||||
if (*(head+26) == 1)
|
if (*(head+26) == 1)
|
||||||
share->system= 1; /* one-record-database */
|
share->system= 1; /* one-record-database */
|
||||||
|
Reference in New Issue
Block a user