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
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
968b1a08
Commit
968b1a08
authored
Apr 07, 2008
by
kostja@dipika.(none)
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Review and update WL#4165 and WL#4166 test coverage.
parent
e392f406
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
1905 additions
and
4485 deletions
+1905
-4485
mysql-test/r/ps_ddl.result
mysql-test/r/ps_ddl.result
+1145
-3245
mysql-test/t/ps_ddl.test
mysql-test/t/ps_ddl.test
+760
-1240
No files found.
mysql-test/r/ps_ddl.result
View file @
968b1a08
This source diff could not be displayed because it is too large. You can
view the blob
instead.
mysql-test/t/ps_ddl.test
View file @
968b1a08
...
...
@@ -47,1629 +47,1082 @@
# - Part 20: Special tables (log tables)
# - Part 21: Special tables (system tables)
# - Part 22: Special tables (views temp tables)
# - Part 23: Special tables (internal join tables)
# - Part 24: Special statements
# - Part 25: Testing the strength of TABLE_SHARE version
let
$base_count
=
SELECT
VARIABLE_VALUE
from
INFORMATION_SCHEMA
.
SESSION_STATUS
where
variable_name
=
'COM_STMT_REPREPARE'
into
@
base_count
;
let
$check
=
SELECT
CASE
(
VARIABLE_VALUE
-
@
base_count
-
@
expected
)
WHEN
0
THEN
"PASSED"
ELSE
"FAILED"
END
AS
`CHECK`
,
(
VARIABLE_VALUE
-
@
base_count
-
@
expected
)
AS
`OFFSET`
from
INFORMATION_SCHEMA
.
SESSION_STATUS
where
variable_name
=
'COM_STMT_REPREPARE'
;
eval
$base_count
;
set
@
expected
=
0
;
# Maintainer:
# When not expecting a re-prepare, write the test like this:
# execute stmt;
# eval $check;
#
# When expecting a re-prepare, write the test like this:
# set @expected = @expected + 1;
# execute stmt;
# eval $check;
#
# - Part 23: Special statements
# - Part 24: Testing the strength of TABLE_SHARE version
--
disable_warnings
drop
temporary
table
if
exists
t1
,
t2
,
t3
;
drop
table
if
exists
t1
,
t2
,
t3
;
drop
procedure
if
exists
p_verify_reprepare_count
;
drop
procedure
if
exists
p1
;
drop
function
if
exists
f1
;
drop
view
if
exists
v1
,
v2
;
--
enable_warnings
delimiter
|
;
create
procedure
p_verify_reprepare_count
(
expected
int
)
begin
declare
old_reprepare_count
int
default
@
reprepare_count
;
select
variable_value
from
information_schema
.
session_status
where
variable_name
=
'com_stmt_reprepare'
into
@
reprepare_count
;
if
old_reprepare_count
+
expected
<>
@
reprepare_count
then
select
concat
(
"Expected: "
,
expected
,
", actual: "
,
@
reprepare_count
-
old_reprepare_count
)
as
"ERROR"
;
else
select
''
as
"SUCCESS"
;
end
if
;
end
|
delimiter
;
|
set
@
reprepare_count
=
0
;
flush
status
;
--
echo
=====================================================================
--
echo
Testing
1
:
NOTHING
->
TABLE
transitions
--
echo
Part
1
:
NOTHING
->
TABLE
transitions
--
echo
=====================================================================
--
disable_warnings
drop
table
if
exists
t1
;
--
enable_warnings
# can not be tested since prepare failed
--
error
ER_NO_SUCH_TABLE
prepare
stmt
from
'select * from t1'
;
prepare
stmt
from
"select * from t1"
;
--
echo
=====================================================================
--
echo
Testing
2
:
NOTHING
->
TEMPORARY
TABLE
transitions
--
echo
Part
2
:
NOTHING
->
TEMPORARY
TABLE
transitions
--
echo
=====================================================================
# can not be tested
--
echo
=====================================================================
--
echo
Testing
3
:
NOTHING
->
VIEW
transitions
--
echo
Part
3
:
NOTHING
->
VIEW
transitions
--
echo
=====================================================================
# can not be tested
--
echo
=====================================================================
--
echo
Testing
4
:
TABLE
->
NOTHING
transitions
--
echo
Part
4
:
TABLE
->
NOTHING
transitions
--
echo
=====================================================================
--
disable_warnings
drop
table
if
exists
t4
;
--
enable_warnings
create
table
t1
(
a
int
);
create
table
t4
(
a
int
);
prepare
stmt
from
'select * from t4'
;
prepare
stmt
from
"select * from t1"
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
drop
table
t
4
;
drop
table
t
1
;
--
error
ER_NO_SUCH_TABLE
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
--
error
ER_NO_SUCH_TABLE
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
);
deallocate
prepare
stmt
;
--
echo
=====================================================================
--
echo
Testing
5
:
TABLE
->
TABLE
(
DDL
)
transitions
--
echo
Part
5
:
TABLE
->
TABLE
(
DDL
)
transitions
--
echo
=====================================================================
--
disable_warnings
drop
table
if
exists
t5
;
--
enable_warnings
create
table
t5
(
a
int
);
create
table
t1
(
a
int
);
prepare
stmt
from
'select a from t5'
;
prepare
stmt
from
"select a from t1"
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
alter
table
t
5
add
column
(
b
int
);
alter
table
t
1
add
column
(
b
int
);
set
@
expected
=
@
expected
+
1
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
1
)
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
drop
table
t5
;
drop
table
t1
;
deallocate
prepare
stmt
;
--
echo
=====================================================================
--
echo
Testing
6
:
TABLE
->
TABLE
(
TRIGGER
)
transitions
--
echo
Part
6
:
TABLE
->
TABLE
(
TRIGGER
)
transitions
--
echo
=====================================================================
#
# Test 6-a: adding a relevant trigger
# Test 6-b: adding an irrelevant trigger
# Test 6-c: changing a relevant trigger
# Test 6-d: changing an irrelevant trigger
# Test 6-e: removing a relevant trigger
# Test 6-f: removing an irrelevant trigger
#
--
disable_warnings
drop
table
if
exists
t6
;
--
enable_warnings
--
echo
# Test 6-a: adding a relevant trigger
create
table
t
6
(
a
int
);
create
table
t
1
(
a
int
);
prepare
stmt
from
'insert into t6(a) value (?)'
;
prepare
stmt
from
"insert into t1 (a) value (?)"
;
set
@
val
=
1
;
execute
stmt
using
@
val
;
eval
$check
;
set
@
val
=
2
;
execute
stmt
using
@
val
;
eval
$check
;
call
p_verify_reprepare_count
(
0
);
# Relevant trigger: execute should reprepare
delimiter
$$
;
create
trigger
t6_bi
before
insert
on
t6
for
each
row
begin
set
@
message
=
"t6_bi"
;
end
$$
delimiter
;
$$
set
@
message
=
"none"
;
create
trigger
t1_bi
before
insert
on
t1
for
each
row
set
@
message
=
new
.
a
;
set
@
val
=
2
;
execute
stmt
using
@
val
;
call
p_verify_reprepare_count
(
1
);
select
@
message
;
set
@
val
=
3
;
set
@
expected
=
@
expected
+
1
;
execute
stmt
using
@
val
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
select
@
message
;
prepare
stmt
from
"insert into t1 (a) value (?)"
;
set
@
val
=
4
;
execute
stmt
using
@
val
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
select
@
message
;
prepare
stmt
from
'insert into t6(a) value (?)'
;
set
@
message
=
"none"
;
--
echo
# Test 6-b: adding an irrelevant trigger
# Unrelated trigger: reprepare may or may not happen, implementation dependent
create
trigger
t1_bd
before
delete
on
t1
for
each
row
set
@
message
=
old
.
a
;
set
@
val
=
5
;
execute
stmt
using
@
val
;
eval
$check
;
call
p_verify_reprepare_count
(
1
)
;
select
@
message
;
set
@
message
=
"none"
;
set
@
val
=
6
;
execute
stmt
using
@
val
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
select
@
message
;
# Unrelated trigger: execute can pass of fail, implementation dependent
delimiter
$$
;
create
trigger
t6_bd
before
delete
on
t6
for
each
row
begin
set
@
message
=
"t6_bd"
;
end
$$
delimiter
;
$$
set
@
message
=
"none"
;
prepare
stmt
from
"insert into t1 (a) value (?)"
;
set
@
val
=
7
;
set
@
expected
=
@
expected
+
1
;
execute
stmt
using
@
val
;
eval
$check
;
select
@
message
;
set
@
message
=
"none"
;
set
@
val
=
8
;
execute
stmt
using
@
val
;
eval
$check
;
call
p_verify_reprepare_count
(
0
);
select
@
message
;
prepare
stmt
from
'insert into t6(a) value (?)'
;
set
@
message
=
"none"
;
set
@
val
=
9
;
execute
stmt
using
@
val
;
eval
$check
;
select
@
message
;
set
@
message
=
"none"
;
set
@
val
=
10
;
execute
stmt
using
@
val
;
eval
$check
;
select
@
message
;
--
echo
# Test 6-c: changing a relevant trigger
# Relevant trigger: execute should reprepare
drop
trigger
t6_bi
;
delimiter
$$
;
create
trigger
t6_bi
before
insert
on
t6
for
each
row
begin
set
@
message
=
"t6_bi (2)"
;
end
$$
delimiter
;
$$
set
@
message
=
"none"
;
set
@
val
=
11
;
set
@
expected
=
@
expected
+
1
;
execute
stmt
using
@
val
;
eval
$check
;
select
@
message
;
set
@
val
=
12
;
execute
stmt
using
@
val
;
eval
$check
;
select
@
message
;
drop
trigger
t1_bi
;
create
trigger
t1_bi
before
insert
on
t1
for
each
row
set
@
message
=
concat
(
"new trigger: "
,
new
.
a
);
prepare
stmt
from
'insert into t6(a) value (?)'
;
set
@
message
=
"none"
;
set
@
val
=
13
;
set
@
val
=
8
;
execute
stmt
using
@
val
;
eval
$check
;
call
p_verify_reprepare_count
(
1
)
;
select
@
message
;
set
@
message
=
"none"
;
set
@
val
=
14
;
set
@
val
=
9
;
execute
stmt
using
@
val
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
select
@
message
;
# Unrelated trigger: execute can pass of fail, implementation dependent
drop
trigger
t6_bd
;
delimiter
$$
;
create
trigger
t6_bd
before
delete
on
t6
for
each
row
begin
set
@
message
=
"t6_bd (2)"
;
end
$$
delimiter
;
$$
set
@
message
=
"none"
;
set
@
val
=
15
;
set
@
expected
=
@
expected
+
1
;
execute
stmt
using
@
val
;
eval
$check
;
select
@
message
;
set
@
message
=
"none"
;
set
@
val
=
16
;
prepare
stmt
from
"insert into t1 (a) value (?)"
;
set
@
val
=
10
;
execute
stmt
using
@
val
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
select
@
message
;
prepare
stmt
from
'insert into t6(a) value (?)'
;
set
@
message
=
"none"
;
set
@
val
=
17
;
execute
stmt
using
@
val
;
eval
$check
;
select
@
message
;
set
@
message
=
"none"
;
set
@
val
=
18
;
execute
stmt
using
@
val
;
eval
$check
;
select
@
message
;
--
echo
# Test 6-d: changing an irrelevant trigger
drop
trigger
t6_bi
;
# Unrelated trigger: reprepare may or may not happen, implementation dependent
drop
trigger
t1_bd
;
set
@
message
=
"none"
;
set
@
val
=
19
;
set
@
expected
=
@
expected
+
1
;
execute
stmt
using
@
val
;
eval
$check
;
select
@
message
;
set
@
val
=
20
;
set
@
val
=
11
;
execute
stmt
using
@
val
;
eval
$check
;
call
p_verify_reprepare_count
(
1
)
;
select
@
message
;
prepare
stmt
from
'insert into t6(a) value (?)'
;
set
@
message
=
"none"
;
set
@
val
=
21
;
--
ehco
Test
6
-
e
:
removing
a
relevant
trigger
drop
trigger
t1_bi
;
set
@
val
=
12
;
execute
stmt
using
@
val
;
eval
$check
;
call
p_verify_reprepare_count
(
1
)
;
select
@
message
;
set
@
val
=
22
;
set
@
val
=
13
;
execute
stmt
using
@
val
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
select
@
message
;
drop
trigger
t6_bd
;
set
@
val
=
23
;
set
@
expected
=
@
expected
+
1
;
execute
stmt
using
@
val
;
eval
$check
;
select
@
message
;
set
@
val
=
24
;
prepare
stmt
from
"insert into t1 (a) value (?)"
;
set
@
val
=
14
;
execute
stmt
using
@
val
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
select
@
message
;
select
*
from
t6
order
by
a
;
drop
table
t6
;
select
*
from
t1
order
by
a
;
drop
table
t1
;
deallocate
prepare
stmt
;
--
echo
=====================================================================
--
echo
Testing
7
:
TABLE
->
TABLE
(
TRIGGER
dependencies
)
transitions
--
echo
Part
7
:
TABLE
->
TABLE
(
TRIGGER
dependencies
)
transitions
--
echo
=====================================================================
#
# Test 7-a: dependent PROCEDURE has changed
# Test 7-b: dependent FUNCTION has changed
# Test 7-c: dependent VIEW has changed
# Test 7-d: dependent TABLE has changed
# Test 7-e: dependent TABLE TRIGGER has changed
#
--
disable_warnings
drop
table
if
exists
t7_proc
;
drop
table
if
exists
t7_func
;
drop
table
if
exists
t7_view
;
drop
table
if
exists
t7_table
;
drop
table
if
exists
t7_dependent_table
;
drop
table
if
exists
t7_table_trigger
;
drop
table
if
exists
t7_audit
;
drop
procedure
if
exists
audit_proc
;
drop
function
if
exists
audit_func
;
drop
view
if
exists
audit_view
;
--
enable_warnings
create
table
t7_proc
(
a
int
);
create
table
t7_func
(
a
int
);
create
table
t7_view
(
a
int
);
create
table
t7_table
(
a
int
);
create
table
t7_table_trigger
(
a
int
);
create
table
t7_audit
(
old_a
int
,
new_a
int
,
reason
varchar
(
50
));
create
table
t7_dependent_table
(
old_a
int
,
new_a
int
,
reason
varchar
(
50
));
create
procedure
audit_proc
(
a
int
)
insert
into
t7_audit
values
(
NULL
,
a
,
"proc v1"
);
--
echo
# Test 7-a: dependent PROCEDURE has changed
--
echo
#
--
echo
# Note, this scenario is not supported, subject of Bug#12093
--
echo
#
create
table
t1
(
a
int
);
create
trigger
t1_ai
after
insert
on
t1
for
each
row
call
p1
(
new
.
a
);
create
procedure
p1
(
a
int
)
begin
end
;
prepare
stmt
from
"insert into t1 (a) values (?)"
;
set
@
var
=
1
;
execute
stmt
using
@
var
;
drop
procedure
p1
;
create
procedure
p1
(
a
int
)
begin
end
;
set
@
var
=
2
;
--
error
ER_SP_DOES_NOT_EXIST
execute
stmt
using
@
var
;
--
echo
# Cleanup
drop
procedure
p1
;
call
p_verify_reprepare_count
(
0
);
--
echo
# Test 7-b: dependent FUNCTION has changed
--
echo
#
--
echo
# Note, this scenario is not supported, subject of Bug#12093
--
echo
#
drop
trigger
t1_ai
;
create
trigger
t1_ai
after
insert
on
t1
for
each
row
select
f1
(
new
.
a
+
1
)
into
@
var
;
create
function
f1
(
a
int
)
returns
int
return
a
;
prepare
stmt
from
"insert into t1(a) values (?)"
;
set
@
var
=
3
;
execute
stmt
using
@
var
;
select
@
var
;
drop
function
f1
;
create
function
f1
(
a
int
)
returns
int
return
0
;
--
error
ER_SP_DOES_NOT_EXIST
execute
stmt
using
@
var
;
call
p_verify_reprepare_count
(
0
);
drop
function
f1
;
deallocate
prepare
stmt
;
create
function
audit_func
()
returns
varchar
(
50
)
return
"func v1"
;
create
view
audit_view
as
select
"view v1"
as
reason
from
dual
;
create
trigger
t7_proc_bi
before
insert
on
t7_proc
for
each
row
call
audit_proc
(
NEW
.
a
);
create
trigger
t7_func_bi
before
insert
on
t7_func
for
each
row
insert
into
t7_audit
values
(
NULL
,
NEW
.
a
,
audit_func
());
create
trigger
t7_view_bi
before
insert
on
t7_view
for
each
row
insert
into
t7_audit
values
(
NULL
,
NEW
.
a
,
(
select
reason
from
audit_view
));
create
trigger
t7_table_bi
before
insert
on
t7_table
for
each
row
insert
into
t7_dependent_table
values
(
NULL
,
NEW
.
a
,
"dependent table"
);
create
trigger
t7_table_trigger_bi
before
insert
on
t7_dependent_table
for
each
row
set
NEW
.
reason
=
"trigger v1"
;
prepare
stmt_proc
from
'insert into t7_proc(a) value (?)'
;
set
@
val
=
101
;
execute
stmt_proc
using
@
val
;
eval
$check
;
set
@
val
=
102
;
execute
stmt_proc
using
@
val
;
eval
$check
;
drop
procedure
audit_proc
;
create
procedure
audit_proc
(
a
int
)
insert
into
t7_audit
values
(
NULL
,
a
,
"proc v2"
);
set
@
val
=
103
;
set
@
expected
=
@
expected
+
1
;
execute
stmt_proc
using
@
val
;
eval
$check
;
set
@
val
=
104
;
execute
stmt_proc
using
@
val
;
eval
$check
;
prepare
stmt_func
from
'insert into t7_func(a) value (?)'
;
set
@
val
=
201
;
execute
stmt_func
using
@
val
;
eval
$check
;
set
@
val
=
202
;
execute
stmt_func
using
@
val
;
eval
$check
;
drop
function
audit_func
;
create
function
audit_func
()
returns
varchar
(
50
)
return
"func v2"
;
set
@
val
=
203
;
set
@
expected
=
@
expected
+
1
;
execute
stmt_func
using
@
val
;
eval
$check
;
set
@
val
=
204
;
execute
stmt_func
using
@
val
;
eval
$check
;
prepare
stmt_view
from
'insert into t7_view(a) value (?)'
;
set
@
val
=
301
;
execute
stmt_view
using
@
val
;
eval
$check
;
set
@
val
=
302
;
execute
stmt_view
using
@
val
;
eval
$check
;
drop
view
audit_view
;
create
view
audit_view
as
select
"view v2"
as
reason
from
dual
;
# Because of Bug#33255, the wrong result is still produced for cases
# 303 and 304, even after re-preparing the statement.
# This is because the table trigger is cached and is not invalidated.
set
@
val
=
303
;
set
@
expected
=
@
expected
+
1
;
execute
stmt_view
using
@
val
;
eval
$check
;
set
@
val
=
304
;
execute
stmt_view
using
@
val
;
eval
$check
;
prepare
stmt_table
from
'insert into t7_table(a) value (?)'
;
set
@
val
=
401
;
execute
stmt_table
using
@
val
;
eval
$check
;
set
@
val
=
402
;
execute
stmt_table
using
@
val
;
eval
$check
;
alter
table
t7_dependent_table
add
column
comments
varchar
(
100
)
default
NULL
;
set
@
val
=
403
;
set
@
expected
=
@
expected
+
1
;
--
error
ER_WRONG_VALUE_COUNT_ON_ROW
execute
stmt_table
using
@
val
;
eval
$check
;
set
@
val
=
404
;
set
@
expected
=
@
expected
+
1
;
--
error
ER_WRONG_VALUE_COUNT_ON_ROW
execute
stmt_table
using
@
val
;
eval
$check
;
alter
table
t7_dependent_table
drop
column
comments
;
set
@
val
=
405
;
set
@
expected
=
@
expected
+
1
;
execute
stmt_table
using
@
val
;
eval
$check
;
set
@
val
=
406
;
execute
stmt_table
using
@
val
;
eval
$check
;
prepare
stmt_table_trigger
from
'insert into t7_table(a) value (?)'
;
set
@
val
=
501
;
execute
stmt_table_trigger
using
@
val
;
eval
$check
;
set
@
val
=
502
;
execute
stmt_table_trigger
using
@
val
;
eval
$check
;
drop
trigger
t7_table_trigger_bi
;
create
trigger
t7_table_trigger_bi
before
insert
on
t7_dependent_table
for
each
row
set
NEW
.
reason
=
"trigger v2"
;
set
@
val
=
503
;
set
@
expected
=
@
expected
+
1
;
execute
stmt_table_trigger
using
@
val
;
eval
$check
;
set
@
val
=
504
;
execute
stmt_table_trigger
using
@
val
;
eval
$check
;
select
*
from
t7_audit
order
by
new_a
;
select
*
from
t7_dependent_table
order
by
new_a
;
drop
table
t7_proc
;
drop
table
t7_func
;
drop
table
t7_view
;
drop
table
t7_table
;
drop
table
t7_dependent_table
;
drop
table
t7_table_trigger
;
drop
table
t7_audit
;
drop
procedure
audit_proc
;
drop
function
audit_func
;
drop
view
audit_view
;
--
echo
# Test 7-c: dependent VIEW has changed
--
echo
#
--
echo
# Note, this scenario is not functioning correctly, see
--
echo
# Bug#33255 Trigger using views and view ddl : corrupted triggers
--
echo
# and Bug #33000 Triggers do not detect changes in meta-data.
--
echo
#
drop
trigger
t1_ai
;
create
table
t2
(
a
int
unique
);
create
table
t3
(
a
int
unique
);
create
view
v1
as
select
a
from
t2
;
create
trigger
t1_ai
after
insert
on
t1
for
each
row
insert
into
v1
(
a
)
values
(
new
.
a
);
--
echo
# Demonstrate that the same bug is present
--
echo
# without prepared statements
insert
into
t1
(
a
)
values
(
5
);
select
*
from
t2
;
select
*
from
t3
;
drop
view
v1
;
create
view
v1
as
select
a
from
t3
;
--
error
ER_NO_SUCH_TABLE
insert
into
t1
(
a
)
values
(
6
);
flush
table
t1
;
insert
into
t1
(
a
)
values
(
6
);
select
*
from
t2
;
select
*
from
t3
;
prepare
stmt
from
"insert into t1 (a) values (?)"
;
set
@
var
=
7
;
execute
stmt
using
@
var
;
call
p_verify_reprepare_count
(
0
);
select
*
from
t3
;
select
*
from
t2
;
drop
view
v1
;
create
view
v1
as
select
a
from
t2
;
set
@
var
=
8
;
execute
stmt
using
@
var
;
call
p_verify_reprepare_count
(
0
);
--
echo
#
--
echo
# Sic: the insert went into t3, even though the view now
--
echo
# points at t2. This is because neither the merged view
--
echo
# nor its prelocking list are affected by view DDL
--
echo
# The binary log is of course wrong, since it is not
--
echo
# using prepared statements
--
echo
#
select
*
from
t2
;
select
*
from
t3
;
flush
table
t1
;
set
@
var
=
9
;
execute
stmt
using
@
var
;
call
p_verify_reprepare_count
(
1
);
select
*
from
t2
;
select
*
from
t3
;
drop
view
v1
;
drop
table
t1
,
t2
,
t3
;
--
echo
# Test 7-d: dependent TABLE has changed
create
table
t1
(
a
int
);
create
trigger
t1_ai
after
insert
on
t1
for
each
row
insert
into
t2
(
a
)
values
(
new
.
a
);
create
table
t2
(
a
int
);
prepare
stmt
from
"insert into t1 (a) values (?)"
;
set
@
var
=
1
;
execute
stmt
using
@
var
;
alter
table
t2
add
column
comment
varchar
(
255
);
set
@
var
=
2
;
--
echo
# Since the dependent table is tracked in the prelocked
--
echo
# list of the prepared statement, invalidation happens
--
echo
# and the statement is re-prepared. This is an unnecessary
--
echo
# side effect, since the statement that *is* dependent
--
echo
# on t2 definition is inside the trigger, and it is currently
--
echo
# not reprepared (see the previous test case).
execute
stmt
using
@
var
;
call
p_verify_reprepare_count
(
1
);
select
*
from
t1
;
select
*
from
t2
;
drop
table
t1
,
t2
;
--
echo
# Test 7-e: dependent TABLE TRIGGER has changed
create
table
t1
(
a
int
);
create
trigger
t1_ai
after
insert
on
t1
for
each
row
insert
into
t2
(
a
)
values
(
new
.
a
);
create
table
t2
(
a
int
unique
);
create
trigger
t2_ai
after
insert
on
t2
for
each
row
insert
into
t3
(
a
)
values
(
new
.
a
);
create
table
t3
(
a
int
unique
);
create
table
t4
(
a
int
unique
);
insert
into
t1
(
a
)
values
(
1
);
select
*
from
t1
join
t2
on
(
t1
.
a
=
t2
.
a
)
join
t3
on
(
t2
.
a
=
t3
.
a
);
drop
trigger
t2_ai
;
create
trigger
t2_ai
after
insert
on
t2
for
each
row
insert
into
t4
(
a
)
values
(
new
.
a
);
insert
into
t1
(
a
)
values
(
2
);
select
*
from
t1
join
t2
on
(
t1
.
a
=
t2
.
a
)
join
t4
on
(
t2
.
a
=
t4
.
a
);
prepare
stmt
from
"insert into t1 (a) values (?)"
;
set
@
var
=
3
;
execute
stmt
using
@
var
;
select
*
from
t1
join
t2
on
(
t1
.
a
=
t2
.
a
)
join
t4
on
(
t2
.
a
=
t4
.
a
);
drop
trigger
t2_ai
;
create
trigger
t2_ai
after
insert
on
t2
for
each
row
insert
into
t3
(
a
)
values
(
new
.
a
);
set
@
var
=
4
;
execute
stmt
using
@
var
;
call
p_verify_reprepare_count
(
1
);
select
*
from
t1
join
t2
on
(
t1
.
a
=
t2
.
a
)
join
t3
on
(
t2
.
a
=
t3
.
a
);
select
*
from
t1
join
t2
on
(
t1
.
a
=
t2
.
a
)
join
t4
on
(
t2
.
a
=
t4
.
a
);
drop
table
t1
,
t2
,
t3
,
t4
;
deallocate
prepare
stmt
;
--
echo
=====================================================================
--
echo
Testing
8
:
TABLE
->
TEMPORARY
TABLE
transitions
--
echo
Part
8
:
TABLE
->
TEMPORARY
TABLE
transitions
--
echo
=====================================================================
--
disable_warnings
drop
table
if
exists
t8
;
--
enable_warnings
create
table
t8
(
a
int
);
create
table
t1
(
a
int
);
prepare
stmt
from
'select * from t8'
;
prepare
stmt
from
"select * from t1"
;
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
drop
table
t
8
;
create
temporary
table
t
8
(
a
int
);
drop
table
t
1
;
create
temporary
table
t
1
(
a
int
);
set
@
expected
=
@
expected
+
1
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
1
)
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
drop
table
t8
;
drop
table
t1
;
deallocate
prepare
stmt
;
--
echo
=====================================================================
--
echo
Testing
9
:
TABLE
->
VIEW
transitions
--
echo
Part
9
:
TABLE
->
VIEW
transitions
--
echo
=====================================================================
--
disable_warnings
drop
table
if
exists
t9
;
drop
table
if
exists
t9_b
;
--
enable_warnings
create
table
t9
(
a
int
);
create
table
t9_b
(
a
int
);
create
table
t1
(
a
int
);
prepare
stmt
from
'select * from t9'
;
prepare
stmt
from
"select * from t1"
;
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
);
drop
table
t9
;
create
view
t9
as
select
*
from
t9_b
;
drop
table
t1
;
create
table
t2
(
a
int
);
create
view
t1
as
select
*
from
t2
;
set
@
expected
=
@
expected
+
1
;
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
1
)
;
drop
view
t9
;
drop
table
t9_b
;
drop
view
t1
;
drop
table
t2
;
deallocate
prepare
stmt
;
--
echo
=====================================================================
--
echo
Testing
10
:
TEMPORARY
TABLE
->
NOTHING
transitions
--
echo
Part
10
:
TEMPORARY
TABLE
->
NOTHING
transitions
--
echo
=====================================================================
--
disable_warnings
drop
temporary
table
if
exists
t10
;
--
enable_warnings
create
temporary
table
t10
(
a
int
);
create
temporary
table
t1
(
a
int
);
prepare
stmt
from
'select * from t10'
;
execute
stmt
;
eval
$check
;
prepare
stmt
from
"select * from t1"
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
drop
temporary
table
t1
0
;
drop
temporary
table
t1
;
--
error
ER_NO_SUCH_TABLE
execute
stmt
;
eval
$check
;
--
error
ER_NO_SUCH_TABLE
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
);
deallocate
prepare
stmt
;
--
echo
=====================================================================
--
echo
Testing
11
:
TEMPORARY
TABLE
->
TABLE
transitions
--
echo
Part
11
:
TEMPORARY
TABLE
->
TABLE
transitions
--
echo
=====================================================================
--
disable_warnings
drop
table
if
exists
t11
;
drop
temporary
table
if
exists
t11
;
--
enable_warnings
create
table
t11
(
a
int
);
insert
into
t11
(
a
)
value
(
1
);
create
temporary
table
t11
(
a
int
);
create
table
t1
(
a
int
);
insert
into
t1
(
a
)
value
(
1
);
create
temporary
table
t1
(
a
int
);
prepare
stmt
from
'select * from t11'
;
execute
stmt
;
eval
$check
;
prepare
stmt
from
"select * from t1"
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
drop
temporary
table
t1
1
;
drop
temporary
table
t1
;
set
@
expected
=
@
expected
+
1
;
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
1
);
select
*
from
t11
;
drop
table
t11
;
select
*
from
t1
;
drop
table
t1
;
deallocate
prepare
stmt
;
--
echo
=====================================================================
--
echo
Testing
12
:
TEMPORARY
TABLE
->
TEMPORARY
TABLE
(
DDL
)
transitions
--
echo
Part
12
:
TEMPORARY
TABLE
->
TEMPORARY
TABLE
(
DDL
)
transitions
--
echo
=====================================================================
--
disable_warnings
drop
temporary
table
if
exists
t12
;
--
enable_warnings
create
temporary
table
t12
(
a
int
);
create
temporary
table
t1
(
a
int
);
prepare
stmt
from
'select a from t12'
;
execute
stmt
;
eval
$check
;
prepare
stmt
from
"select a from t1"
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
drop
temporary
table
t1
2
;
create
temporary
table
t1
2
(
a
int
,
b
int
);
drop
temporary
table
t1
;
create
temporary
table
t1
(
a
int
,
b
int
);
set
@
expected
=
@
expected
+
1
;
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
1
);
select
*
from
t12
;
drop
table
t12
;
select
*
from
t1
;
drop
temporary
table
t1
;
deallocate
prepare
stmt
;
--
echo
=====================================================================
--
echo
Testing
13
:
TEMPORARY
TABLE
->
VIEW
transitions
--
echo
Part
13
:
TEMPORARY
TABLE
->
VIEW
transitions
--
echo
=====================================================================
--
disable_warnings
drop
temporary
table
if
exists
t13
;
drop
table
if
exists
t13_b
;
--
enable_warnings
create
temporary
table
t1
(
a
int
);
create
table
t2
(
a
int
);
create
temporary
table
t13
(
a
int
);
create
table
t13_b
(
a
int
);
prepare
stmt
from
'select * from t13'
;
execute
stmt
;
eval
$check
;
prepare
stmt
from
"select * from t1"
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
drop
temporary
table
t1
3
;
create
view
t1
3
as
select
*
from
t13_b
;
drop
temporary
table
t1
;
create
view
t1
as
select
*
from
t2
;
set
@
expected
=
@
expected
+
1
;
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
1
)
;
drop
view
t13
;
drop
table
t13_b
;
drop
view
t1
;
drop
table
t2
;
deallocate
prepare
stmt
;
--
echo
=====================================================================
--
echo
Testing
14
:
VIEW
->
NOTHING
transitions
--
echo
Part
14
:
VIEW
->
NOTHING
transitions
--
echo
=====================================================================
--
disable_warnings
drop
view
if
exists
t14
;
drop
table
if
exists
t14_b
;
--
enable_warnings
create
table
t14_b
(
a
int
);
create
view
t14
as
select
*
from
t14_b
;
create
table
t2
(
a
int
);
create
view
t1
as
select
*
from
t2
;
prepare
stmt
from
'select * from t14'
;
prepare
stmt
from
"select * from t1"
;
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
drop
view
t14
;
drop
view
t1
;
set
@
expected
=
@
expected
+
1
;
--
error
ER_NO_SUCH_TABLE
execute
stmt
;
eval
$check
;
set
@
expected
=
@
expected
+
1
;
call
p_verify_reprepare_count
(
0
);
--
error
ER_NO_SUCH_TABLE
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
drop
table
t14_b
;
drop
table
t2
;
deallocate
prepare
stmt
;
--
echo
=====================================================================
--
echo
Testing
15
:
VIEW
->
TABLE
transitions
--
echo
Part
15
:
VIEW
->
TABLE
transitions
--
echo
=====================================================================
--
disable_warnings
drop
view
if
exists
t15
;
drop
table
if
exists
t15_b
;
--
enable_warnings
create
table
t2
(
a
int
);
create
view
t1
as
select
*
from
t2
;
create
table
t15_b
(
a
int
);
create
view
t15
as
select
*
from
t15_b
;
prepare
stmt
from
'select * from t15'
;
execute
stmt
;
eval
$check
;
prepare
stmt
from
"select * from t1"
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
drop
view
t1
5
;
create
table
t1
5
(
a
int
);
drop
view
t1
;
create
table
t1
(
a
int
);
set
@
expected
=
@
expected
+
1
;
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
1
);
drop
table
t15_b
;
drop
table
t15
;
drop
table
t2
;
drop
table
t1
;
deallocate
prepare
stmt
;
--
echo
=====================================================================
--
echo
Testing
16
:
VIEW
->
TEMPORARY
TABLE
transitions
--
echo
Part
16
:
VIEW
->
TEMPORARY
TABLE
transitions
--
echo
=====================================================================
--
disable_warnings
drop
view
if
exists
t16
;
drop
table
if
exists
t16_b
;
--
enable_warnings
create
table
t16_b
(
a
int
);
create
view
t16
as
select
*
from
t16_b
;
create
table
t2
(
a
int
);
insert
into
t2
(
a
)
values
(
1
);
create
view
t1
as
select
*
from
t2
;
prepare
stmt
from
'select * from t16'
;
execute
stmt
;
eval
$check
;
prepare
stmt
from
"select * from t1"
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
drop
view
t16
;
create
temporary
table
t16
(
a
int
);
set
@
expected
=
@
expected
+
1
;
create
temporary
table
t1
(
a
int
);
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
1
);
drop
view
t1
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
drop
table
t16_b
;
drop
temporary
table
t16
;
drop
table
t2
;
drop
temporary
table
t1
;
deallocate
prepare
stmt
;
--
echo
=====================================================================
--
echo
Testing
17
:
VIEW
->
VIEW
(
DDL
)
transitions
--
echo
Part
17
:
VIEW
->
VIEW
(
DDL
)
transitions
--
echo
=====================================================================
--
disable_warnings
drop
view
if
exists
t17
;
drop
table
if
exists
t17_b
;
--
enable_warnings
create
table
t17_b
(
a
int
);
insert
into
t17_b
values
(
10
),
(
20
),
(
30
);
create
table
t2
(
a
int
);
insert
into
t2
values
(
10
),
(
20
),
(
30
);
create
view
t1
7
as
select
a
,
2
*
a
as
b
,
3
*
a
as
c
from
t17_b
;
select
*
from
t1
7
;
create
view
t1
as
select
a
,
2
*
a
as
b
,
3
*
a
as
c
from
t2
;
select
*
from
t1
;
prepare
stmt
from
'select * from t17'
;
prepare
stmt
from
"select * from t1"
;
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
drop
view
t1
7
;
create
view
t1
7
as
select
a
,
2
*
a
as
b
,
5
*
a
as
c
from
t17_b
;
select
*
from
t1
7
;
drop
view
t1
;
create
view
t1
as
select
a
,
2
*
a
as
b
,
5
*
a
as
c
from
t2
;
select
*
from
t1
;
set
@
expected
=
@
expected
+
1
;
--
echo
# Currently a different result from conventional statements.
--
echo
# A view is inlined once at prepare, later on view DDL
--
echo
# does not affect prepared statement and it is not re-prepared.
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
);
flush
table
t2
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
1
)
;
drop
table
t17_b
;
drop
view
t17
;
drop
table
t2
;
drop
view
t1
;
deallocate
prepare
stmt
;
--
echo
=====================================================================
--
echo
Testing
18
:
VIEW
->
VIEW
(
VIEW
dependencies
)
transitions
--
echo
Part
18
:
VIEW
->
VIEW
(
VIEW
dependencies
)
transitions
--
echo
=====================================================================
#
# Test 18-a: dependent PROCEDURE has changed (via a trigger)
# Test 18-b: dependent FUNCTION has changed
# Test 18-c: dependent VIEW has changed
# Test 18-d: dependent TABLE has changed
# Test 18-e: dependent TABLE TRIGGER has changed
#
--
disable_warnings
drop
table
if
exists
t18
;
drop
table
if
exists
t18_dependent_table
;
drop
view
if
exists
t18_func
;
drop
view
if
exists
t18_view
;
drop
view
if
exists
t18_table
;
drop
function
if
exists
view_func
;
drop
view
if
exists
view_view
;
--
enable_warnings
# TODO: insertable view -> trigger
# TODO: insertable view -> trigger -> proc ?
create
table
t18
(
a
int
);
insert
into
t18
values
(
1
),
(
2
),
(
3
);
create
function
view_func
(
x
int
)
returns
int
return
x
+
1
;
create
view
view_view
as
select
"view v1"
as
reason
from
dual
;
create
table
t18_dependent_table
(
a
int
);
create
view
t18_func
as
select
a
,
view_func
(
a
)
as
b
from
t18
;
create
view
t18_view
as
select
a
,
reason
as
b
from
t18
,
view_view
;
create
view
t18_table
as
select
*
from
t18
;
--
echo
# Part 18a: dependent function has changed
create
table
t1
(
a
int
);
insert
into
t1
(
a
)
values
(
1
),
(
2
),
(
3
);
create
function
f1
()
returns
int
return
(
select
max
(
a
)
from
t1
);
create
view
v1
as
select
f1
();
prepare
stmt
from
"select * from v1"
;
execute
stmt
;
execute
stmt
;
call
p_verify_reprepare_count
(
0
);
drop
function
f1
;
create
function
f1
()
returns
int
return
2
;
--
echo
# XXX: Bug#12093. We only get a different error
--
echo
# message because the non-existing procedure error is masked
--
echo
# by the view.
--
error
ER_VIEW_INVALID
execute
stmt
;
--
error
ER_VIEW_INVALID
execute
stmt
;
call
p_verify_reprepare_count
(
0
);
prepare
stmt_func
from
'select * from t18_func'
;
execute
stmt_func
;
eval
$check
;
execute
stmt_func
;
eval
$check
;
--
echo
# Part 18b: dependent procedure has changed (referred to via a function)
drop
function
view_func
;
create
function
view_func
(
x
int
)
returns
int
return
x
*
x
;
create
table
t2
(
a
int
);
insert
into
t2
(
a
)
values
(
4
),
(
5
),
(
6
);
set
@
expected
=
@
expected
+
1
;
execute
stmt_func
;
eval
$check
;
execute
stmt_func
;
eval
$check
;
drop
function
f1
;
delimiter
|
;
create
function
f1
()
returns
int
begin
declare
x
int
;
call
p1
(
x
);
return
x
;
end
|
delimiter
;
|
create
procedure
p1
(
out
x
int
)
select
max
(
a
)
from
t1
into
x
;
prepare
stmt_view
from
'select * from t18_view'
;
execute
stmt_view
;
eval
$check
;
execute
stmt_view
;
eval
$check
;
prepare
stmt
from
"select * from v1"
;
execute
stmt
;
execute
stmt
;
call
p_verify_reprepare_count
(
0
);
drop
procedure
p1
;
create
procedure
p1
(
out
x
int
)
select
max
(
a
)
from
t2
into
x
;
--
echo
# XXX: bug. The prelocked list is not invalidated
--
echo
# and we keep opening table t1, whereas the procedure
--
ehco
# is now referring to table t2
--
error
ER_VIEW_INVALID
execute
stmt
;
call
p_verify_reprepare_count
(
0
);
flush
table
t1
;
execute
stmt
;
call
p_verify_reprepare_count
(
1
);
execute
stmt
;
drop
view
view_view
;
create
view
view_view
as
select
"view v2"
as
reason
from
dual
;
--
echo
# Test 18-c: dependent VIEW has changed
set
@
expected
=
@
expected
+
1
;
execute
stmt_view
;
eval
$check
;
execute
stmt_view
;
eval
$check
;
drop
view
v1
;
create
view
v2
as
select
a
from
t1
;
create
view
v1
as
select
*
from
v2
;
prepare
stmt
from
"select * from v1"
;
execute
stmt
;
execute
stmt
;
call
p_verify_reprepare_count
(
0
);
drop
view
v2
;
create
view
v2
as
select
a
from
t2
;
execute
stmt
;
execute
stmt
;
call
p_verify_reprepare_count
(
0
);
flush
table
t1
;
execute
stmt
;
call
p_verify_reprepare_count
(
1
);
execute
stmt
;
--
echo
# Test 18-d: dependent TABLE has changed
drop
view
v2
;
create
table
v2
as
select
*
from
t1
;
execute
stmt
;
call
p_verify_reprepare_count
(
1
);
execute
stmt
;
call
p_verify_reprepare_count
(
0
);
drop
table
v2
;
create
table
v2
(
a
int
unique
)
as
select
*
from
t2
;
execute
stmt
;
call
p_verify_reprepare_count
(
1
);
execute
stmt
;
call
p_verify_reprepare_count
(
0
);
prepare
stmt_table
from
'select * from t18_table'
;
execute
stmt_table
;
eval
$check
;
execute
stmt_table
;
eval
$check
;
--
echo
# Test 18-e: dependent TABLE trigger has changed
alter
table
t18
add
column
comments
varchar
(
50
)
default
NULL
;
prepare
stmt
from
"insert into v1 (a) values (?)"
;
set
@
var
=
7
;
execute
stmt
using
@
var
;
call
p_verify_reprepare_count
(
0
);
create
trigger
v2_bi
before
insert
on
v2
for
each
row
set
@
message
=
"v2_bi"
;
set
@
var
=
8
;
execute
stmt
using
@
var
;
call
p_verify_reprepare_count
(
1
);
select
@
message
;
drop
trigger
v2_bi
;
set
@
message
=
null
;
set
@
var
=
9
;
execute
stmt
using
@
var
;
call
p_verify_reprepare_count
(
1
);
select
@
message
;
create
trigger
v2_bi
after
insert
on
v2
for
each
row
set
@
message
=
"v2_ai"
;
set
@
var
=
10
;
execute
stmt
using
@
var
;
call
p_verify_reprepare_count
(
1
);
select
@
message
;
select
*
from
v1
;
set
@
expected
=
@
expected
+
1
;
execute
stmt_table
;
eval
$check
;
execute
stmt_table
;
eval
$check
;
--
echo
# Cleanup
drop
table
t18
;
drop
table
t18_dependent_table
;
drop
view
t18_func
;
drop
view
t18_view
;
drop
view
t18_table
;
drop
function
view_func
;
d
rop
view
view_view
;
--
disable_warnings
drop
table
if
exists
t1
,
t2
,
v1
,
v2
;
drop
view
if
exists
v1
,
v2
;
drop
function
f1
;
drop
procedure
p1
;
--
enable_warnings
d
eallocate
prepare
stmt
;
--
echo
=====================================================================
--
echo
Testing
19
:
Special
tables
(
INFORMATION_SCHEMA
)
--
echo
Part
19
:
Special
tables
(
INFORMATION_SCHEMA
)
--
echo
=====================================================================
--
disable_warnings
drop
procedure
if
exists
proc_19
;
--
enable_warnings
# Using a temporary table internally should not confuse the prepared
# statement code, and should not raise ER_PS_INVALIDATED errors
prepare
stmt
from
'
select ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_TYPE
"
select ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_TYPE
from INFORMATION_SCHEMA.ROUTINES where
routine_name=
\'proc_19\''
;
routine_name=
'p1'"
;
create
procedure
p
roc_19
()
select
"hi there"
;
create
procedure
p
1
()
select
"hi there"
;
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
drop
procedure
p
roc_19
;
create
procedure
p
roc_19
()
select
"hi there, again"
;
drop
procedure
p
1
;
create
procedure
p
1
()
select
"hi there, again"
;
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
drop
procedure
proc_19
;
drop
procedure
p1
;
deallocate
prepare
stmt
;
--
echo
=====================================================================
--
echo
Testing
20
:
Special
tables
(
log
tables
)
--
echo
Part
20
:
Special
tables
(
log
tables
)
--
echo
=====================================================================
prepare
stmt
from
'select * from mysql.general_log where argument=\'IMPOSSIBLE QUERY STRING\''
;
"select * from mysql.general_log where argument='IMPOSSIBLE QUERY STRING'"
;
--
disable_result_log
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
--
enable_result_log
call
p_verify_reprepare_count
(
0
);
deallocate
prepare
stmt
;
--
echo
=====================================================================
--
echo
Testing
21
:
Special
tables
(
system
tables
)
--
echo
Part
21
:
Special
tables
(
system
tables
)
--
echo
=====================================================================
--
disable_warnings
drop
procedure
if
exists
proc_21
;
--
enable_warnings
prepare
stmt
from
'select type, db, name from mysql.proc where name=\'proc_21\''
;
"select type, db, name from mysql.proc where name='p1'"
;
create
procedure
p
roc_2
1
()
select
"hi there"
;
create
procedure
p1
()
select
"hi there"
;
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
drop
procedure
p
roc_2
1
;
create
procedure
p
roc_2
1
()
select
"hi there, again"
;
drop
procedure
p1
;
create
procedure
p1
()
select
"hi there, again"
;
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
drop
procedure
proc_21
;
drop
procedure
p1
;
deallocate
prepare
stmt
;
--
echo
=====================================================================
--
echo
Testing
22
:
Special
tables
(
views
temp
tables
)
--
echo
Part
22
:
Special
tables
(
views
temp
tables
)
--
echo
=====================================================================
--
disable_warnings
drop
table
if
exists
t22_b
;
drop
view
if
exists
t22
;
--
enable_warnings
create
table
t22_b
(
a
int
);
create
table
t1
(
a
int
);
create
algorithm
=
temptable
view
t22
as
select
a
*
a
as
a2
from
t22_b
;
create
algorithm
=
temptable
view
v1
as
select
a
*
a
as
a2
from
t1
;
# Using a temporary table internally should not confuse the prepared
# statement code, and should not raise ER_PS_INVALIDATED errors
show
create
view
t22
;
--
echo
# Using a temporary table internally should not confuse the prepared
--
echo
# statement code, and should not raise ER_PS_INVALIDATED errors
show
create
view
v1
;
prepare
stmt
from
'select * from t22'
;
prepare
stmt
from
"select * from v1"
;
insert
into
t
22_b
values
(
1
),
(
2
),
(
3
);
insert
into
t
1
values
(
1
),
(
2
),
(
3
);
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
insert
into
t
22_b
values
(
4
),
(
5
),
(
6
);
insert
into
t
1
values
(
4
),
(
5
),
(
6
);
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
drop
table
t
22_b
;
drop
view
t22
;
drop
table
t
1
;
drop
view
v1
;
--
echo
=====================================================================
--
echo
Testing
23
:
Special
tables
(
internal
join
tables
)
--
echo
Part
23
:
Special
statements
--
echo
=====================================================================
--
disable_warnings
drop
table
if
exists
t23_a
;
drop
table
if
exists
t23_b
;
--
enable_warnings
--
echo
# SQLCOM_ALTER_TABLE:
create
table
t23_a
(
a
int
);
create
table
t23_b
(
b
int
);
# Using a temporary table internally should not confuse the prepared
# statement code, and should not raise ER_PS_INVALIDATED errors
prepare
stmt
from
'select * from t23_a join t23_b'
;
insert
into
t23_a
values
(
1
),
(
2
),
(
3
);
insert
into
t23_b
values
(
10
),
(
20
),
(
30
);
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
create
table
t1
(
a
int
);
insert
into
t23_a
values
(
4
);
insert
into
t23_b
values
(
40
);
execute
stmt
;
eval
$check
;
prepare
stmt
from
"alter table t1 add column b int"
;
execute
stmt
;
eval
$check
;
drop
table
t
23_a
;
drop
table
t23_b
;
drop
table
t
1
;
create
table
t1
(
a1
int
,
a2
int
)
;
--
echo
=====================================================================
--
echo
Testing
24
:
Special
statements
--
echo
=====================================================================
# SQLCOM_ALTER_TABLE:
--
disable_warnings
drop
table
if
exists
t24_alter
;
--
enable_warnings
create
table
t24_alter
(
a
int
);
prepare
stmt
from
'alter table t24_alter add column b int'
;
--
echo
# t1 has changed, and it's does not lead to reprepare
execute
stmt
;
eval
$check
;
drop
table
t24_alter
;
create
table
t24_alter
(
a1
int
,
a2
int
);
# t24_alter has changed, and it's not a problem
alter
table
t1
drop
column
b
;
execute
stmt
;
eval
$check
;
alter
table
t
24_alter
drop
column
b
;
alter
table
t
1
drop
column
b
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
alter
table
t24_alter
drop
column
b
;
execute
stmt
;
eval
$check
;
drop
table
t1
;
drop
table
t24_alter
;
--
echo
# SQLCOM_REPAIR:
# SQLCOM_REPAIR:
create
table
t1
(
a
int
);
--
disable_warnings
drop
table
if
exists
t24_repair
;
--
enable_warnings
insert
into
t1
values
(
1
),
(
2
),
(
3
);
create
table
t24_repair
(
a
int
);
insert
into
t24_repair
values
(
1
),
(
2
),
(
3
);
prepare
stmt
from
"repair table t1"
;
prepare
stmt
from
'repair table t24_repair'
;
execute
stmt
;
e
val
$check
;
e
xecute
stmt
;
drop
table
t
24_repair
;
create
table
t
24_repair
(
a1
int
,
a2
int
);
insert
into
t
24_repair
values
(
1
,
10
),
(
2
,
20
),
(
3
,
30
);
drop
table
t
1
;
create
table
t
1
(
a1
int
,
a2
int
);
insert
into
t
1
values
(
1
,
10
),
(
2
,
20
),
(
3
,
30
);
# t24_repair has changed, and it's not a problem
--
echo
# t1 has changed, and it's does not lead to reprepare
execute
stmt
;
eval
$check
;
alter
table
t
24_repair
add
column
b
varchar
(
50
)
default
NULL
;
alter
table
t
1
add
column
b
varchar
(
50
)
default
NULL
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
alter
table
t
24_repair
drop
column
b
;
alter
table
t
1
drop
column
b
;
execute
stmt
;
eval
$check
;
drop
table
t24_repair
;
# SQLCOM_ANALYZE:
--
disable_warnings
drop
table
if
exists
t24_analyze
;
--
enable_warnings
call
p_verify_reprepare_count
(
0
);
create
table
t24_analyze
(
a
int
);
insert
into
t24_analyze
values
(
1
),
(
2
),
(
3
);
--
echo
# SQLCOM_ANALYZE:
prepare
stmt
from
'analyze table t24_analyze'
;
prepare
stmt
from
"analyze table t1"
;
execute
stmt
;
eval
$check
;
drop
table
t24_analyze
;
create
table
t24_analyze
(
a1
int
,
a2
int
);
insert
into
t24_analyze
values
(
1
,
10
),
(
2
,
20
),
(
3
,
30
);
# t24_analyze has changed, and it's not a problem
drop
table
t1
;
create
table
t1
(
a1
int
,
a2
int
);
insert
into
t1
values
(
1
,
10
),
(
2
,
20
),
(
3
,
30
);
--
echo
# t1 has changed, and it's not a problem
execute
stmt
;
eval
$check
;
alter
table
t
24_analyze
add
column
b
varchar
(
50
)
default
NULL
;
alter
table
t
1
add
column
b
varchar
(
50
)
default
NULL
;
execute
stmt
;
eval
$check
;
alter
table
t
24_analyze
drop
column
b
;
alter
table
t
1
drop
column
b
;
execute
stmt
;
eval
$check
;
drop
table
t24_analyze
;
# SQLCOM_OPTIMIZE:
call
p_verify_reprepare_count
(
0
);
--
disable_warnings
drop
table
if
exists
t24_optimize
;
--
enable_warnings
--
echo
# SQLCOM_OPTIMIZE:
create
table
t24_optimize
(
a
int
);
insert
into
t24_optimize
values
(
1
),
(
2
),
(
3
);
prepare
stmt
from
'optimize table t24_optimize'
;
prepare
stmt
from
"optimize table t1"
;
execute
stmt
;
eval
$check
;
drop
table
t
24_optimize
;
create
table
t
24_optimize
(
a1
int
,
a2
int
);
insert
into
t
24_optimize
values
(
1
,
10
),
(
2
,
20
),
(
3
,
30
);
drop
table
t
1
;
create
table
t
1
(
a1
int
,
a2
int
);
insert
into
t
1
values
(
1
,
10
),
(
2
,
20
),
(
3
,
30
);
# t24_optimize
has changed, and it's not a problem
--
echo
# t1
has changed, and it's not a problem
execute
stmt
;
eval
$check
;
alter
table
t
24_optimize
add
column
b
varchar
(
50
)
default
NULL
;
alter
table
t
1
add
column
b
varchar
(
50
)
default
NULL
;
execute
stmt
;
eval
$check
;
alter
table
t
24_optimize
drop
column
b
;
alter
table
t
1
drop
column
b
;
execute
stmt
;
eval
$check
;
drop
table
t24_optimize
;
call
p_verify_reprepare_count
(
0
);
# SQLCOM_SHOW_CREATE_PROC:
drop
table
t1
;
--
disable_warnings
drop
procedure
if
exists
changing_proc
;
--
enable_warnings
--
echo
# SQLCOM_SHOW_CREATE_PROC:
prepare
stmt
from
'show create procedure changing_proc'
;
prepare
stmt
from
"show create procedure p1"
;
--
error
ER_SP_DOES_NOT_EXIST
execute
stmt
;
eval
$check
;
--
error
ER_SP_DOES_NOT_EXIST
execute
stmt
;
eval
$check
;
create
procedure
changing_proc
()
begin
end
;
create
procedure
p1
()
begin
end
;
# changing_proc has changed, and it's not a problem
--
disable_result_log
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
--
enable_result_log
drop
procedure
changing_proc
;
create
procedure
changing_proc
(
x
int
,
y
int
)
begin
end
;
drop
procedure
p1
;
create
procedure
p1
(
x
int
,
y
int
)
begin
end
;
--
disable_result_log
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
--
enable_result_log
drop
procedure
changing_proc
;
drop
procedure
p1
;
--
error
ER_SP_DOES_NOT_EXIST
execute
stmt
;
eval
$check
;
--
error
ER_SP_DOES_NOT_EXIST
execute
stmt
;
eval
$check
;
# SQLCOM_SHOW_CREATE_FUNC:
call
p_verify_reprepare_count
(
0
);
--
disable_warnings
drop
function
if
exists
changing_func
;
--
enable_warnings
--
echo
# SQLCOM_SHOW_CREATE_FUNC:
prepare
stmt
from
'show create function changing_func'
;
prepare
stmt
from
"show create function f1"
;
--
error
ER_SP_DOES_NOT_EXIST
execute
stmt
;
eval
$check
;
--
error
ER_SP_DOES_NOT_EXIST
execute
stmt
;
eval
$check
;
create
function
changing_func
()
returns
int
return
0
;
create
function
f1
()
returns
int
return
0
;
# changing_proc has changed, and it's not a problem
--
disable_result_log
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
--
enable_result_log
drop
function
changing_func
;
create
function
changing_func
(
x
int
,
y
int
)
returns
int
return
x
+
y
;
drop
function
f1
;
create
function
f1
(
x
int
,
y
int
)
returns
int
return
x
+
y
;
--
disable_result_log
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
--
enable_result_log
drop
function
changing_func
;
drop
function
f1
;
--
error
ER_SP_DOES_NOT_EXIST
execute
stmt
;
eval
$check
;
--
error
ER_SP_DOES_NOT_EXIST
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
# SQLCOM_SHOW_CREATE_TRIGGER:
--
disable_warnings
drop
table
if
exists
t24_trigger
;
--
enable_warnings
--
echo
# SQLCOM_SHOW_CREATE_TRIGGER:
create
table
t
24_trigger
(
a
int
);
create
table
t
1
(
a
int
);
prepare
stmt
from
'show create trigger t24_bi;'
;
prepare
stmt
from
"show create trigger t1_bi"
;
--
error
ER_TRG_DOES_NOT_EXIST
execute
stmt
;
eval
$check
;
--
error
ER_TRG_DOES_NOT_EXIST
execute
stmt
;
eval
$check
;
delimiter
$$
;
create
trigger
t24_bi
before
insert
on
t24_trigger
for
each
row
begin
set
@
message
=
"t24_bi"
;
end
$$
delimiter
;
$$
create
trigger
t1_bi
before
insert
on
t1
for
each
row
set
@
message
=
"t1_bi"
;
# t24_bi has changed, and it's not a problem
--
disable_result_log
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
--
enable_result_log
drop
trigger
t24_bi
;
delimiter
$$
;
create
trigger
t24_bi
before
insert
on
t24_trigger
for
each
row
begin
set
@
message
=
"t24_bi (2)"
;
end
$$
delimiter
;
$$
drop
trigger
t1_bi
;
# t24_bi has changed, and it's not a problem
set
@
expected
=
@
expected
+
1
;
create
trigger
t1_bi
before
insert
on
t1
for
each
row
set
@
message
=
"t1_bi (2)"
;
--
disable_result_log
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
--
enable_result_log
drop
trigger
t
24
_bi
;
drop
trigger
t
1
_bi
;
--
error
ER_TRG_DOES_NOT_EXIST
execute
stmt
;
eval
$check
;
--
error
ER_TRG_DOES_NOT_EXIST
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
drop
table
t24_trigger
;
drop
table
t1
;
deallocate
prepare
stmt
;
--
echo
=====================================================================
--
echo
Testing
25
:
Testing
the
strength
of
TABLE_SHARE
version
--
echo
Part
24
:
Testing
the
strength
of
TABLE_SHARE
version
--
echo
=====================================================================
# Test 25
-a: number of columns
--
echo
# Test 24
-a: number of columns
--
disable_warnings
drop
table
if
exists
t25_num_col
;
--
enable_warnings
create
table
t1
(
a
int
);
create
table
t25_num_col
(
a
int
);
prepare
stmt
from
'select a from t25_num_col'
;
execute
stmt
;
eval
$check
;
prepare
stmt
from
"select a from t1"
;
execute
stmt
;
eval
$check
;
alter
table
t25_num_col
add
column
b
varchar
(
50
)
default
NULL
;
set
@
expected
=
@
expected
+
1
;
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
drop
table
t25_num_col
;
# Test 25-b: column name
--
disable_warnings
drop
table
if
exists
t25_col_name
;
--
enable_warnings
call
p_verify_reprepare_count
(
0
);
create
table
t25_col_name
(
a
int
)
;
alter
table
t1
add
column
b
varchar
(
50
)
default
NULL
;
prepare
stmt
from
'select * from t25_col_name'
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
1
)
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
alter
table
t25_col_name
change
a
b
int
;
--
echo
# Test 24-b: column name
set
@
expected
=
@
expected
+
1
;
--
error
ER_PS_REBIND
alter
table
t1
change
b
c
int
;
execute
stmt
;
eval
$check
;
set
@
expected
=
@
expected
+
1
;
--
error
ER_PS_REBIND
call
p_verify_reprepare_count
(
1
);
execute
stmt
;
eval
$check
;
drop
table
t25_col_name
;
# Test 25-c: column type
--
disable_warnings
drop
table
if
exists
t25_col_type
;
--
enable_warnings
call
p_verify_reprepare_count
(
0
);
create
table
t25_col_type
(
a
int
);
--
echo
# Test 24-c: column type
prepare
stmt
from
'select * from t25_col_type'
;
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
alter
table
t1
change
a
a
varchar
(
10
);
alter
table
t25_col_type
change
a
a
varchar
(
10
);
set
@
expected
=
@
expected
+
1
;
--
error
ER_PS_REBIND
execute
stmt
;
eval
$check
;
set
@
expected
=
@
expected
+
1
;
--
error
ER_PS_REBIND
call
p_verify_reprepare_count
(
1
);
execute
stmt
;
eval
$check
;
drop
table
t25_col_type
;
call
p_verify_reprepare_count
(
0
);
# Test 25-d: column type length
--
disable_warnings
drop
table
if
exists
t25_col_type_length
;
--
enable_warnings
--
echo
# Test 24-d: column type length
create
table
t25_col_type_length
(
a
varchar
(
10
)
);
alter
table
t1
change
a
a
varchar
(
20
);
prepare
stmt
from
'select * from t25_col_type_length'
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
1
)
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
alter
table
t25_col_type_length
change
a
a
varchar
(
20
);
--
echo
# Test 24-e: column NULL property
set
@
expected
=
@
expected
+
1
;
--
error
ER_PS_REBIND
execute
stmt
;
eval
$check
;
set
@
expected
=
@
expected
+
1
;
--
error
ER_PS_REBIND
execute
stmt
;
eval
$check
;
drop
table
t25_col_type_length
;
# Test 25-e: column NULL property
--
disable_warnings
drop
table
if
exists
t25_col_null
;
--
enable_warnings
alter
table
t1
change
a
a
varchar
(
20
)
NOT
NULL
;
create
table
t25_col_null
(
a
varchar
(
10
));
prepare
stmt
from
'select * from t25_col_null'
;
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
alter
table
t25_col_null
change
a
a
varchar
(
10
)
NOT
NULL
;
set
@
expected
=
@
expected
+
1
;
--
error
ER_PS_REBIND
execute
stmt
;
eval
$check
;
set
@
expected
=
@
expected
+
1
;
--
error
ER_PS_REBIND
call
p_verify_reprepare_count
(
1
);
execute
stmt
;
eval
$check
;
drop
table
t25_col_null
;
call
p_verify_reprepare_count
(
0
);
# Test 25
-f: column DEFAULT
--
echo
# Test 24
-f: column DEFAULT
--
disable_warnings
drop
table
if
exists
t25_col_default
;
--
enable_warnings
create
table
t25_col_default
(
a
int
,
b
int
DEFAULT
10
);
prepare
stmt
from
'insert into t25_col_default(a) values (?)'
;
set
@
val
=
1
;
execute
stmt
using
@
val
;
eval
$check
;
set
@
val
=
2
;
execute
stmt
using
@
val
;
eval
$check
;
alter
table
t25_col_default
change
b
b
int
DEFAULT
20
;
alter
table
t1
change
c
c
int
DEFAULT
20
;
set
@
val
=
3
;
# Must insert the correct default value for b
set
@
expected
=
@
expected
+
1
;
execute
stmt
using
@
val
;
eval
$check
;
set
@
val
=
4
;
# Must insert the correct default value for b
execute
stmt
using
@
val
;
eval
$check
;
select
*
from
t25_col_default
;
drop
table
t25_col_default
;
# Test 25-g: number of keys
--
disable_warnings
drop
table
if
exists
t25_index
;
--
enable_warnings
create
table
t25_index
(
a
varchar
(
10
));
prepare
stmt
from
'select * from t25_index'
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
1
)
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
create
index
i1
on
t25_index
(
a
);
--
echo
# Test 24-g: number of keys
create
unique
index
t1_a_idx
on
t1
(
a
);
set
@
expected
=
@
expected
+
1
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
1
)
;
execute
stmt
;
eval
$check
;
drop
table
t25_index
;
# Test 25-h: changing index uniqueness
--
disable_warnings
drop
table
if
exists
t25_index_unique
;
--
enable_warnings
call
p_verify_reprepare_count
(
0
);
create
table
t25_index_unique
(
a
varchar
(
10
),
b
varchar
(
10
));
create
index
i1
on
t25_index_unique
(
a
,
b
);
--
echo
# Test 24-h: changing index uniqueness
show
create
table
t25_index_unique
;
drop
index
t1_a_idx
on
t1
;
create
index
t1_a_idx
on
t1
(
a
);
prepare
stmt
from
'select * from t25_index_unique'
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
1
)
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
alter
table
t25_index_unique
drop
index
i1
;
create
unique
index
i1
on
t25_index_unique
(
a
,
b
)
;
--
echo
# Cleanup
drop
table
t1
;
show
create
table
t25_index_unique
;
set
@
expected
=
@
expected
+
1
;
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
drop
table
t25_index_unique
;
deallocate
prepare
stmt
;
--
echo
=====================================================================
--
echo
Testing
reported
bugs
--
echo
=====================================================================
#
# Bug#12093 (SP not found on second PS execution if another thread drops
# other SP in between)
#
--
disable_warnings
drop
table
if
exists
table_12093
;
drop
function
if
exists
func_12093
;
drop
function
if
exists
func_12093_unrelated
;
drop
procedure
if
exists
proc_12093
;
--
enable_warnings
connect
(
con1
,
localhost
,
root
,,);
connection
default
;
create
table
table_12093
(
a
int
);
delimiter
//;
create
function
func_12093
()
returns
int
begin
return
(
select
count
(
*
)
from
table_12093
);
end
//
create
procedure
proc_12093
(
a
int
)
begin
select
*
from
table_12093
;
end
//
delimiter
;
//
create
function
func_12093_unrelated
()
returns
int
return
2
;
create
procedure
proc_12093_unrelated
()
begin
end
;
prepare
stmt_sf
from
'select func_12093();'
;
prepare
stmt_sp
from
'call proc_12093(func_12093())'
;
execute
stmt_sf
;
eval
$check
;
execute
stmt_sp
;
eval
$check
;
connection
con1
;
drop
function
func_12093_unrelated
;
drop
procedure
proc_12093_unrelated
;
connection
default
;
# previously, failed with --error 1305
execute
stmt_sf
;
eval
$check
;
# previously, failed with --error 1305
execute
stmt_sp
;
eval
$check
;
# previously, failed with --error 1305
execute
stmt_sf
;
eval
$check
;
# previously, failed with --error 1305
execute
stmt_sp
;
eval
$check
;
deallocate
prepare
stmt_sf
;
deallocate
prepare
stmt_sp
;
disconnect
con1
;
drop
table
table_12093
;
drop
function
func_12093
;
drop
procedure
proc_12093
;
#
# Bug#21294 (executing a prepared statement that executes a stored function
# which was recreat)
#
--
disable_warnings
drop
function
if
exists
func_21294
;
--
enable_warnings
create
function
func_21294
()
returns
int
return
10
;
prepare
stmt
from
"select func_21294()"
;
execute
stmt
;
eval
$check
;
drop
function
func_21294
;
create
function
func_21294
()
returns
int
return
10
;
# might pass or fail, implementation dependent
execute
stmt
;
eval
$check
;
drop
function
func_21294
;
create
function
func_21294
()
returns
int
return
20
;
set
@
expected
=
@
expected
+
1
;
execute
stmt
;
eval
$check
;
deallocate
prepare
stmt
;
drop
function
func_21294
;
#
# Bug#27420 (A combination of PS and view operations cause error + assertion
# on shutdown)
#
--
echo
#
--
echo
# Bug#27420 A combination of PS and view operations cause
--
echo
# error + assertion on shutdown
--
echo
#
--
disable_warnings
drop
table
if
exists
t_27420_100
;
...
...
@@ -1677,10 +1130,6 @@ drop table if exists t_27420_101;
drop
view
if
exists
v_27420
;
--
enable_warnings
connect
(
con1
,
localhost
,
root
,,);
connection
default
;
create
table
t_27420_100
(
a
int
);
insert
into
t_27420_100
values
(
1
),
(
2
);
...
...
@@ -1691,46 +1140,33 @@ create view v_27420 as select t_27420_100.a X, t_27420_101.a Y
from
t_27420_100
,
t_27420_101
where
t_27420_100
.
a
=
t_27420_101
.
a
;
prepare
stmt
from
'select * from v_27420'
;
prepare
stmt
from
"select * from v_27420"
;
execute
stmt
;
eval
$check
;
connection
con1
;
call
p_verify_reprepare_count
(
0
);
drop
view
v_27420
;
create
table
v_27420
(
X
int
,
Y
int
);
connection
default
;
set
@
expected
=
@
expected
+
1
;
execute
stmt
;
eval
$check
;
connection
con1
;
call
p_verify_reprepare_count
(
1
);
drop
table
v_27420
;
# passes in 5.0, fails in 5.1, should pass
create
table
v_27420
(
a
int
,
b
int
,
filler
char
(
200
));
connection
default
;
set
@
expected
=
@
expected
+
1
;
--
error
ER_PS_REBIND
execute
stmt
;
eval
$check
;
disconnect
con1
;
call
p_verify_reprepare_count
(
1
);
deallocate
prepare
stmt
;
drop
table
t_27420_100
;
drop
table
t_27420_101
;
drop
table
v_27420
;
deallocate
prepare
stmt
;
#
# Bug#27430 (Crash in subquery code when in PS and table DDL changed after
# PREPARE)
#
--
echo
#
--
echo
# Bug#27430 Crash in subquery code when in PS and table DDL changed
--
echo
# after PREPARE
--
echo
#
--
disable_warnings
drop
table
if
exists
t_27430_1
;
...
...
@@ -1753,12 +1189,10 @@ insert into t_27430_2 values
(
1234
,
4
);
prepare
stmt
from
'select oref, a, a in (select a from t_27430_1 where oref=t_27430_2.oref) Z from t_27430_2'
;
"select oref, a, a in (select a from t_27430_1 where oref=t_27430_2.oref) Z from t_27430_2"
;
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
);
drop
table
t_27430_1
,
t_27430_2
;
...
...
@@ -1777,23 +1211,17 @@ insert into t_27430_2 values
(
NULL
,
3
),
(
NULL
,
4
);
set
@
expected
=
@
expected
+
1
;
--
error
ER_PS_REBIND
execute
stmt
;
eval
$check
;
set
@
expected
=
@
expected
+
1
;
--
error
ER_PS_REBIND
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
1
);
deallocate
prepare
stmt
;
drop
table
t_27430_1
;
drop
table
t_27430_2
;
deallocate
prepare
stmt
;
#
# Bug#27690 (Re-execution of prepared statement after table was replaced
# with a view crashes)
#
--
echo
#
--
echo
# Bug#27690 Re-execution of prepared statement after table
--
echo
# was replaced with a view crashes
--
echo
#
--
disable_warnings
drop
table
if
exists
t_27690_1
;
...
...
@@ -1807,33 +1235,125 @@ insert into t_27690_1 values (1,1),(2,2);
create
table
v_27690_1
as
select
*
from
t_27690_1
;
create
table
v_27690_2
as
select
*
from
t_27690_1
;
prepare
stmt
from
'select * from v_27690_1, v_27690_2'
;
prepare
stmt
from
"select * from v_27690_1, v_27690_2"
;
execute
stmt
;
eval
$check
;
execute
stmt
;
eval
$check
;
drop
table
v_27690_1
;
--
error
ER_NO_SUCH_TABLE
execute
stmt
;
eval
$check
;
--
error
ER_NO_SUCH_TABLE
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
create
view
v_27690_1
as
select
A
.
a
,
A
.
b
from
t_27690_1
A
,
t_27690_1
B
;
set
@
expected
=
@
expected
+
1
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
1
)
;
execute
stmt
;
eval
$check
;
call
p_verify_reprepare_count
(
0
)
;
deallocate
prepare
stmt
;
drop
table
t_27690_1
;
drop
view
v_27690_1
;
drop
table
v_27690_2
;
deallocate
prepare
stmt
;
--
echo
#=====================================================================
--
echo
# TODO: fix the below two bugs and modify their tests
--
echo
#
--
echo
# Bug#21294 Executing a prepared statement that executes
--
echo
# a stored function which was recreat
--
echo
#
create
function
f1
()
returns
int
return
10
;
prepare
stmt
from
"select f1()"
;
execute
stmt
;
drop
function
f1
;
create
function
f1
()
returns
int
return
10
;
# might pass or fail, implementation dependent
--
error
ER_SP_DOES_NOT_EXIST
execute
stmt
;
drop
function
f1
;
create
function
f1
()
returns
int
return
20
;
--
error
ER_SP_DOES_NOT_EXIST
execute
stmt
;
call
p_verify_reprepare_count
(
0
);
drop
function
f1
;
deallocate
prepare
stmt
;
--
echo
#
--
echo
# Bug#12093 SP not found on second PS execution if another thread drops
--
echo
# other SP in between
--
echo
#
--
disable_warnings
drop
table
if
exists
t_12093
;
drop
function
if
exists
f_12093
;
drop
function
if
exists
f_12093_unrelated
;
drop
procedure
if
exists
p_12093
;
--
enable_warnings
create
table
t_12093
(
a
int
);
create
function
f_12093
()
returns
int
return
(
select
count
(
*
)
from
t_12093
);
create
procedure
p_12093
(
a
int
)
select
*
from
t_12093
;
create
function
f_12093_unrelated
()
returns
int
return
2
;
create
procedure
p_12093_unrelated
()
begin
end
;
prepare
stmt_sf
from
'select f_12093();'
;
prepare
stmt_sp
from
'call p_12093(f_12093())'
;
execute
stmt_sf
;
execute
stmt_sp
;
connect
(
con1
,
localhost
,
root
,,);
connection
con1
;
drop
function
f_12093_unrelated
;
drop
procedure
p_12093_unrelated
;
connection
default
;
--
echo
# XXX: bug
--
error
ER_SP_DOES_NOT_EXIST
execute
stmt_sf
;
--
echo
# XXX: bug
--
error
ER_SP_DOES_NOT_EXIST
execute
stmt_sp
;
--
echo
# XXX: bug
--
error
ER_SP_DOES_NOT_EXIST
execute
stmt_sf
;
--
echo
# XXX: bug
--
error
ER_SP_DOES_NOT_EXIST
execute
stmt_sp
;
call
p_verify_reprepare_count
(
0
);
disconnect
con1
;
drop
table
t_12093
;
drop
function
f_12093
;
drop
procedure
p_12093
;
deallocate
prepare
stmt_sf
;
deallocate
prepare
stmt_sp
;
--
echo
# Cleanup
--
echo
#
--
disable_warnings
drop
temporary
table
if
exists
t1
,
t2
,
t3
;
drop
table
if
exists
t1
,
t2
,
t3
,
v1
,
v2
;
drop
procedure
if
exists
p_verify_reprepare_count
;
drop
procedure
if
exists
p1
;
drop
function
if
exists
f1
;
drop
view
if
exists
v1
,
v2
;
--
enable_warnings
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