Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
46de7157
Commit
46de7157
authored
Dec 01, 2006
by
thek@kpdesk.mysql.com
Browse files
Options
Browse Files
Download
Plain Diff
Merge kpdesk.mysql.com:/home/thek/dev/bug22043/my50-bug22043
into kpdesk.mysql.com:/home/thek/dev/bug22043/my51-bug22043
parents
ea6a9175
b201d4ef
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
52 additions
and
75 deletions
+52
-75
mysql-test/r/information_schema.result
mysql-test/r/information_schema.result
+1
-1
mysql-test/t/information_schema.test
mysql-test/t/information_schema.test
+1
-1
sql/sql_parse.cc
sql/sql_parse.cc
+50
-73
No files found.
mysql-test/r/information_schema.result
View file @
46de7157
...
@@ -1080,7 +1080,7 @@ CREATE PROCEDURE p1 ()
...
@@ -1080,7 +1080,7 @@ CREATE PROCEDURE p1 ()
BEGIN
BEGIN
SELECT 'foo' FROM DUAL;
SELECT 'foo' FROM DUAL;
END |
END |
ERROR 42000:
Access denied for user 'root'@'localhost' to
database 'information_schema'
ERROR 42000:
Unknown
database 'information_schema'
select ROUTINE_NAME from routines;
select ROUTINE_NAME from routines;
ROUTINE_NAME
ROUTINE_NAME
grant all on information_schema.* to 'user1'@'localhost';
grant all on information_schema.* to 'user1'@'localhost';
...
...
mysql-test/t/information_schema.test
View file @
46de7157
...
@@ -721,7 +721,7 @@ create temporary table schemata(f1 char(10));
...
@@ -721,7 +721,7 @@ create temporary table schemata(f1 char(10));
# Bug #10708 SP's can use INFORMATION_SCHEMA as ROUTINE_SCHEMA
# Bug #10708 SP's can use INFORMATION_SCHEMA as ROUTINE_SCHEMA
#
#
delimiter
|
;
delimiter
|
;
--
error
1044
--
error
ER_BAD_DB_ERROR
CREATE
PROCEDURE
p1
()
CREATE
PROCEDURE
p1
()
BEGIN
BEGIN
SELECT
'foo'
FROM
DUAL
;
SELECT
'foo'
FROM
DUAL
;
...
...
sql/sql_parse.cc
View file @
46de7157
...
@@ -4383,11 +4383,10 @@ end_with_restore_list:
...
@@ -4383,11 +4383,10 @@ end_with_restore_list:
{
{
uint
namelen
;
uint
namelen
;
char
*
name
;
char
*
name
;
int
result
;
int
result
=
SP_INTERNAL_ERROR
;
DBUG_ASSERT
(
lex
->
sphead
!=
0
);
DBUG_ASSERT
(
lex
->
sphead
!=
0
);
DBUG_ASSERT
(
lex
->
sphead
->
m_db
.
str
);
/* Must be initialized in the parser */
DBUG_ASSERT
(
lex
->
sphead
->
m_db
.
str
);
/* Must be initialized in the parser */
/*
/*
Verify that the database name is allowed, optionally
Verify that the database name is allowed, optionally
lowercase it.
lowercase it.
...
@@ -4395,37 +4394,26 @@ end_with_restore_list:
...
@@ -4395,37 +4394,26 @@ end_with_restore_list:
if
(
check_db_name
(
lex
->
sphead
->
m_db
.
str
))
if
(
check_db_name
(
lex
->
sphead
->
m_db
.
str
))
{
{
my_error
(
ER_WRONG_DB_NAME
,
MYF
(
0
),
lex
->
sphead
->
m_db
.
str
);
my_error
(
ER_WRONG_DB_NAME
,
MYF
(
0
),
lex
->
sphead
->
m_db
.
str
);
delete
lex
->
sphead
;
goto
create_sp_error
;
lex
->
sphead
=
0
;
goto
error
;
}
}
/*
/*
Check that a database with this name
Check that a database directory with this name
exists.
exists. Design note: This won't work on virtual databases
like information_schema.
*/
*/
if
(
check_db_dir_existence
(
lex
->
sphead
->
m_db
.
str
))
if
(
check_db_dir_existence
(
lex
->
sphead
->
m_db
.
str
))
{
{
my_error
(
ER_BAD_DB_ERROR
,
MYF
(
0
),
lex
->
sphead
->
m_db
.
str
);
my_error
(
ER_BAD_DB_ERROR
,
MYF
(
0
),
lex
->
sphead
->
m_db
.
str
);
delete
lex
->
sphead
;
goto
create_sp_error
;
lex
->
sphead
=
0
;
goto
error
;
}
}
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
)))
is_schema_db
(
lex
->
sphead
->
m_db
.
str
)))
{
goto
create_sp_error
;
delete
lex
->
sphead
;
lex
->
sphead
=
0
;
goto
error
;
}
if
(
end_active_trans
(
thd
))
if
(
end_active_trans
(
thd
))
{
goto
create_sp_error
;
delete
lex
->
sphead
;
lex
->
sphead
=
0
;
goto
error
;
}
name
=
lex
->
sphead
->
name
(
&
namelen
);
name
=
lex
->
sphead
->
name
(
&
namelen
);
#ifdef HAVE_DLOPEN
#ifdef HAVE_DLOPEN
...
@@ -4435,10 +4423,8 @@ end_with_restore_list:
...
@@ -4435,10 +4423,8 @@ end_with_restore_list:
if
(
udf
)
if
(
udf
)
{
{
my_error
(
ER_UDF_EXISTS
,
MYF
(
0
),
name
);
my_error
(
ER_UDF_EXISTS
,
MYF
(
0
),
name
);
delete
lex
->
sphead
;
goto
create_sp_error
;
lex
->
sphead
=
0
;
goto
error
;
}
}
}
}
#endif
#endif
...
@@ -4446,7 +4432,7 @@ end_with_restore_list:
...
@@ -4446,7 +4432,7 @@ end_with_restore_list:
/*
/*
If the definer is not specified, this means that CREATE-statement missed
If the definer is not specified, this means that CREATE-statement missed
DEFINER-clause. DEFINER-clause can be missed in two cases:
DEFINER-clause. DEFINER-clause can be missed in two cases:
- The user submitted a statement w/o the clause. This is a normal
- The user submitted a statement w/o the clause. This is a normal
case, we should assign CURRENT_USER as definer.
case, we should assign CURRENT_USER as definer.
...
@@ -4455,7 +4441,7 @@ end_with_restore_list:
...
@@ -4455,7 +4441,7 @@ end_with_restore_list:
CURRENT_USER as definer here, but also we should mark this routine
CURRENT_USER as definer here, but also we should mark this routine
as NON-SUID. This is essential for the sake of backward
as NON-SUID. This is essential for the sake of backward
compatibility.
compatibility.
The problem is the slave thread is running under "special" user (@),
The problem is the slave thread is running under "special" user (@),
that actually does not exist. In the older versions we do not fail
that actually does not exist. In the older versions we do not fail
execution of a stored routine if its definer does not exist and
execution of a stored routine if its definer does not exist and
...
@@ -4480,13 +4466,9 @@ end_with_restore_list:
...
@@ -4480,13 +4466,9 @@ end_with_restore_list:
if
(
ps_arena
)
if
(
ps_arena
)
thd
->
restore_active_arena
(
ps_arena
,
&
original_arena
);
thd
->
restore_active_arena
(
ps_arena
,
&
original_arena
);
/* Error has been already reported. */
if
(
res
)
if
(
res
)
{
goto
create_sp_error
;
/* Error has been already reported. */
delete
lex
->
sphead
;
lex
->
sphead
=
0
;
goto
error
;
}
if
(
thd
->
slave_thread
)
if
(
thd
->
slave_thread
)
lex
->
sphead
->
m_chistics
->
suid
=
SP_IS_NOT_SUID
;
lex
->
sphead
->
m_chistics
->
suid
=
SP_IS_NOT_SUID
;
...
@@ -4497,7 +4479,7 @@ end_with_restore_list:
...
@@ -4497,7 +4479,7 @@ end_with_restore_list:
that the current user has SUPER privilege (in order to create a stored
that the current user has SUPER privilege (in order to create a stored
routine under another user one must have SUPER privilege).
routine under another user one must have SUPER privilege).
*/
*/
else
if
(
strcmp
(
lex
->
definer
->
user
.
str
,
thd
->
security_ctx
->
priv_user
)
||
else
if
(
strcmp
(
lex
->
definer
->
user
.
str
,
thd
->
security_ctx
->
priv_user
)
||
my_strcasecmp
(
system_charset_info
,
my_strcasecmp
(
system_charset_info
,
lex
->
definer
->
host
.
str
,
lex
->
definer
->
host
.
str
,
...
@@ -4506,9 +4488,7 @@ end_with_restore_list:
...
@@ -4506,9 +4488,7 @@ end_with_restore_list:
if
(
check_global_access
(
thd
,
SUPER_ACL
))
if
(
check_global_access
(
thd
,
SUPER_ACL
))
{
{
my_error
(
ER_SPECIFIC_ACCESS_DENIED_ERROR
,
MYF
(
0
),
"SUPER"
);
my_error
(
ER_SPECIFIC_ACCESS_DENIED_ERROR
,
MYF
(
0
),
"SUPER"
);
delete
lex
->
sphead
;
goto
create_sp_error
;
lex
->
sphead
=
0
;
goto
error
;
}
}
}
}
...
@@ -4528,54 +4508,51 @@ end_with_restore_list:
...
@@ -4528,54 +4508,51 @@ end_with_restore_list:
#endif
/* NO_EMBEDDED_ACCESS_CHECKS */
#endif
/* NO_EMBEDDED_ACCESS_CHECKS */
res
=
(
result
=
lex
->
sphead
->
create
(
thd
));
res
=
(
result
=
lex
->
sphead
->
create
(
thd
));
if
(
result
==
SP_OK
)
switch
(
result
)
{
{
case
SP_OK
:
#ifndef NO_EMBEDDED_ACCESS_CHECKS
#ifndef NO_EMBEDDED_ACCESS_CHECKS
/* only add privileges if really neccessary */
/* only add privileges if really neccessary */
if
(
sp_automatic_privileges
&&
!
opt_noacl
&&
if
(
sp_automatic_privileges
&&
!
opt_noacl
&&
check_routine_access
(
thd
,
DEFAULT_CREATE_PROC_ACLS
,
check_routine_access
(
thd
,
DEFAULT_CREATE_PROC_ACLS
,
lex
->
sphead
->
m_db
.
str
,
name
,
lex
->
sphead
->
m_db
.
str
,
name
,
lex
->
sql_command
==
SQLCOM_CREATE_PROCEDURE
,
1
))
lex
->
sql_command
==
SQLCOM_CREATE_PROCEDURE
,
1
))
{
{
if
(
sp_grant_privileges
(
thd
,
lex
->
sphead
->
m_db
.
str
,
name
,
if
(
sp_grant_privileges
(
thd
,
lex
->
sphead
->
m_db
.
str
,
name
,
lex
->
sql_command
==
SQLCOM_CREATE_PROCEDURE
))
lex
->
sql_command
==
SQLCOM_CREATE_PROCEDURE
))
push_warning
(
thd
,
MYSQL_ERROR
::
WARN_LEVEL_WARN
,
push_warning
(
thd
,
MYSQL_ERROR
::
WARN_LEVEL_WARN
,
ER_PROC_AUTO_GRANT_FAIL
,
ER_PROC_AUTO_GRANT_FAIL
,
ER
(
ER_PROC_AUTO_GRANT_FAIL
));
ER
(
ER_PROC_AUTO_GRANT_FAIL
));
close_thread_tables
(
thd
);
close_thread_tables
(
thd
);
}
}
#endif
#endif
lex
->
unit
.
cleanup
();
delete
lex
->
sphead
;
lex
->
sphead
=
0
;
send_ok
(
thd
);
}
else
{
switch
(
result
)
{
case
SP_WRITE_ROW_FAILED
:
my_error
(
ER_SP_ALREADY_EXISTS
,
MYF
(
0
),
SP_TYPE_STRING
(
lex
),
name
);
break
;
case
SP_NO_DB_ERROR
:
my_error
(
ER_BAD_DB_ERROR
,
MYF
(
0
),
lex
->
sphead
->
m_db
.
str
);
break
;
case
SP_BAD_IDENTIFIER
:
my_error
(
ER_TOO_LONG_IDENT
,
MYF
(
0
),
name
);
break
;
case
SP_BODY_TOO_LONG
:
my_error
(
ER_TOO_LONG_BODY
,
MYF
(
0
),
name
);
break
;
default:
my_error
(
ER_SP_STORE_FAILED
,
MYF
(
0
),
SP_TYPE_STRING
(
lex
),
name
);
break
;
}
lex
->
unit
.
cleanup
();
delete
lex
->
sphead
;
lex
->
sphead
=
0
;
goto
error
;
}
break
;
break
;
}
case
SP_WRITE_ROW_FAILED
:
my_error
(
ER_SP_ALREADY_EXISTS
,
MYF
(
0
),
SP_TYPE_STRING
(
lex
),
name
);
break
;
case
SP_BAD_IDENTIFIER
:
my_error
(
ER_TOO_LONG_IDENT
,
MYF
(
0
),
name
);
break
;
case
SP_BODY_TOO_LONG
:
my_error
(
ER_TOO_LONG_BODY
,
MYF
(
0
),
name
);
break
;
default:
my_error
(
ER_SP_STORE_FAILED
,
MYF
(
0
),
SP_TYPE_STRING
(
lex
),
name
);
break
;
}
/* end switch */
/*
Capture all errors within this CASE and
clean up the environment.
*/
create_sp_error:
lex
->
unit
.
cleanup
();
delete
lex
->
sphead
;
lex
->
sphead
=
0
;
if
(
result
!=
SP_OK
)
goto
error
;
send_ok
(
thd
);
break
;
/* break super switch */
}
/* end case group bracket */
case
SQLCOM_CALL
:
case
SQLCOM_CALL
:
{
{
sp_head
*
sp
;
sp_head
*
sp
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment