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
f9ea947b
Commit
f9ea947b
authored
Jan 13, 2006
by
dlenev@mysql.com
Browse files
Options
Browse Files
Download
Plain Diff
Merge bk-internal.mysql.com:/home/bk/mysql-5.0
into mysql.com:/home/dlenev/src/mysql-5.0-bg12198-2
parents
4d59111a
d14e7014
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
168 additions
and
10 deletions
+168
-10
mysql-test/r/sp.result
mysql-test/r/sp.result
+67
-0
mysql-test/t/sp.test
mysql-test/t/sp.test
+78
-2
sql/sp_head.cc
sql/sp_head.cc
+23
-8
No files found.
mysql-test/r/sp.result
View file @
f9ea947b
...
...
@@ -918,6 +918,11 @@ drop function if exists f5|
drop function if exists f6|
drop function if exists f7|
drop function if exists f8|
drop function if exists f9|
drop function if exists f10|
drop function if exists f11|
drop function if exists f12_1|
drop function if exists f12_2|
drop view if exists v0|
drop view if exists v1|
drop view if exists v2|
...
...
@@ -1097,6 +1102,62 @@ ERROR HY000: Table 't1' was not locked with LOCK TABLES
select f4()|
ERROR HY000: Table 't2' was not locked with LOCK TABLES
unlock tables|
create function f9() returns int
begin
declare a, b int;
drop temporary table if exists t3;
create temporary table t3 (id int);
insert into t3 values (1), (2), (3);
set a:= (select count(*) from t3);
set b:= (select count(*) from t3 t3_alias);
return a + b;
end|
select f9()|
f9()
6
Warnings:
Note 1051 Unknown table 't3'
select f9() from t1 limit 1|
f9()
6
create function f10() returns int
begin
drop temporary table if exists t3;
create temporary table t3 (id int);
insert into t3 select id from t4;
return (select count(*) from t3);
end|
select f10()|
ERROR 42S02: Table 'test.t4' doesn't exist
create table t4 as select 1 as id|
select f10()|
f10()
1
create function f11() returns int
begin
drop temporary table if exists t3;
create temporary table t3 (id int);
insert into t3 values (1), (2), (3);
return (select count(*) from t3 as a, t3 as b);
end|
select f11()|
ERROR HY000: Can't reopen table: 'a'
select f11() from t1|
ERROR HY000: Can't reopen table: 'a'
create function f12_1() returns int
begin
drop temporary table if exists t3;
create temporary table t3 (id int);
insert into t3 values (1), (2), (3);
return f12_2();
end|
create function f12_2() returns int
return (select count(*) from t3)|
drop temporary table t3|
select f12_1()|
ERROR 42S02: Table 'test.t3' doesn't exist
select f12_1() from t1 limit 1|
ERROR 42S02: Table 'test.t3' doesn't exist
drop function f0|
drop function f1|
drop function f2|
...
...
@@ -1106,11 +1167,17 @@ drop function f5|
drop function f6|
drop function f7|
drop function f8|
drop function f9|
drop function f10|
drop function f11|
drop function f12_1|
drop function f12_2|
drop view v0|
drop view v1|
drop view v2|
delete from t1 |
delete from t2 |
drop table t4|
drop table if exists fac|
create table fac (n int unsigned not null primary key, f bigint unsigned)|
drop procedure if exists ifac|
...
...
mysql-test/t/sp.test
View file @
f9ea947b
...
...
@@ -1157,6 +1157,11 @@ drop function if exists f5|
drop
function
if
exists
f6
|
drop
function
if
exists
f7
|
drop
function
if
exists
f8
|
drop
function
if
exists
f9
|
drop
function
if
exists
f10
|
drop
function
if
exists
f11
|
drop
function
if
exists
f12_1
|
drop
function
if
exists
f12_2
|
drop
view
if
exists
v0
|
drop
view
if
exists
v1
|
drop
view
if
exists
v2
|
...
...
@@ -1234,8 +1239,6 @@ create function f7() returns int
select
f6
()
|
select
id
,
f6
()
from
t1
|
# TODO Test temporary table handling
#
# Let us test how new locking work with views
#
...
...
@@ -1316,6 +1319,73 @@ select * from v1, t1|
select
f4
()
|
unlock
tables
|
# Tests for handling of temporary tables in functions.
#
# Unlike for permanent tables we should be able to create, use
# and drop such tables in functions.
#
# Simplest function using temporary table. It is also test case for bug
# #12198 "Temporary table aliasing does not work inside stored functions"
create
function
f9
()
returns
int
begin
declare
a
,
b
int
;
drop
temporary
table
if
exists
t3
;
create
temporary
table
t3
(
id
int
);
insert
into
t3
values
(
1
),
(
2
),
(
3
);
set
a
:=
(
select
count
(
*
)
from
t3
);
set
b
:=
(
select
count
(
*
)
from
t3
t3_alias
);
return
a
+
b
;
end
|
# This will emit warning as t3 was not existing before.
select
f9
()
|
select
f9
()
from
t1
limit
1
|
# Function which uses both temporary and permanent tables.
create
function
f10
()
returns
int
begin
drop
temporary
table
if
exists
t3
;
create
temporary
table
t3
(
id
int
);
insert
into
t3
select
id
from
t4
;
return
(
select
count
(
*
)
from
t3
);
end
|
# Check that we don't ignore completely tables used in function
--
error
ER_NO_SUCH_TABLE
select
f10
()
|
create
table
t4
as
select
1
as
id
|
select
f10
()
|
# Practical cases which we don't handle well (yet)
#
# Function which does not work because of well-known and documented
# limitation of MySQL. We can't use the several instances of the
# same temporary table in statement.
create
function
f11
()
returns
int
begin
drop
temporary
table
if
exists
t3
;
create
temporary
table
t3
(
id
int
);
insert
into
t3
values
(
1
),
(
2
),
(
3
);
return
(
select
count
(
*
)
from
t3
as
a
,
t3
as
b
);
end
|
--
error
ER_CANT_REOPEN_TABLE
select
f11
()
|
--
error
ER_CANT_REOPEN_TABLE
select
f11
()
from
t1
|
# We don't handle temporary tables used by nested functions well
create
function
f12_1
()
returns
int
begin
drop
temporary
table
if
exists
t3
;
create
temporary
table
t3
(
id
int
);
insert
into
t3
values
(
1
),
(
2
),
(
3
);
return
f12_2
();
end
|
create
function
f12_2
()
returns
int
return
(
select
count
(
*
)
from
t3
)
|
# We need clean start to get error
drop
temporary
table
t3
|
--
error
ER_NO_SUCH_TABLE
select
f12_1
()
|
--
error
ER_NO_SUCH_TABLE
select
f12_1
()
from
t1
limit
1
|
# Cleanup
drop
function
f0
|
...
...
@@ -1327,11 +1397,17 @@ drop function f5|
drop
function
f6
|
drop
function
f7
|
drop
function
f8
|
drop
function
f9
|
drop
function
f10
|
drop
function
f11
|
drop
function
f12_1
|
drop
function
f12_2
|
drop
view
v0
|
drop
view
v1
|
drop
view
v2
|
delete
from
t1
|
delete
from
t2
|
drop
table
t4
|
# End of non-bug tests
...
...
sql/sp_head.cc
View file @
f9ea947b
...
...
@@ -3131,7 +3131,14 @@ sp_restore_security_context(THD *thd, Security_context *backup)
typedef
struct
st_sp_table
{
LEX_STRING
qname
;
/* Multi-set key: db_name\0table_name\0alias\0 */
/*
Multi-set key:
db_name\0table_name\0alias\0 - for normal tables
db_name\0table_name\0 - for temporary tables
Note that in both cases we don't take last '\0' into account when
we count length of key.
*/
LEX_STRING
qname
;
uint
db_length
,
table_name_length
;
bool
temp
;
/* true if corresponds to a temporary table */
thr_lock_type
lock_type
;
/* lock type used for prelocking */
...
...
@@ -3201,10 +3208,14 @@ sp_head::merge_table_list(THD *thd, TABLE_LIST *table, LEX *lex_for_tmp_check)
tname
[
tlen
]
=
'\0'
;
/*
It is safe to store pointer to table list elements in hash,
since they are supposed to have the same lifetime.
We ignore alias when we check if table was already marked as temporary
(and therefore should not be prelocked). Otherwise we will erroneously
treat table with same name but with different alias as non-temporary.
*/
if
((
tab
=
(
SP_TABLE
*
)
hash_search
(
&
m_sptabs
,
(
byte
*
)
tname
,
tlen
)))
if
((
tab
=
(
SP_TABLE
*
)
hash_search
(
&
m_sptabs
,
(
byte
*
)
tname
,
tlen
))
||
((
tab
=
(
SP_TABLE
*
)
hash_search
(
&
m_sptabs
,
(
byte
*
)
tname
,
tlen
-
alen
-
1
))
&&
tab
->
temp
))
{
if
(
tab
->
lock_type
<
table
->
lock_type
)
tab
->
lock_type
=
table
->
lock_type
;
// Use the table with the highest lock type
...
...
@@ -3216,14 +3227,18 @@ sp_head::merge_table_list(THD *thd, TABLE_LIST *table, LEX *lex_for_tmp_check)
{
if
(
!
(
tab
=
(
SP_TABLE
*
)
thd
->
calloc
(
sizeof
(
SP_TABLE
))))
return
FALSE
;
tab
->
qname
.
length
=
tlen
;
tab
->
qname
.
str
=
(
char
*
)
thd
->
memdup
(
tname
,
tab
->
qname
.
length
+
1
);
if
(
!
tab
->
qname
.
str
)
return
FALSE
;
if
(
lex_for_tmp_check
->
sql_command
==
SQLCOM_CREATE_TABLE
&&
lex_for_tmp_check
->
query_tables
==
table
&&
lex_for_tmp_check
->
create_info
.
options
&
HA_LEX_CREATE_TMP_TABLE
)
{
tab
->
temp
=
TRUE
;
tab
->
qname
.
length
=
tlen
-
alen
-
1
;
}
else
tab
->
qname
.
length
=
tlen
;
tab
->
qname
.
str
=
(
char
*
)
thd
->
memdup
(
tname
,
tab
->
qname
.
length
+
1
);
if
(
!
tab
->
qname
.
str
)
return
FALSE
;
tab
->
table_name_length
=
table
->
table_name_length
;
tab
->
db_length
=
table
->
db_length
;
tab
->
lock_type
=
table
->
lock_type
;
...
...
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