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
2038ced4
Commit
2038ced4
authored
Apr 08, 2005
by
pem@mysql.comhem.se
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fixed BUG#9073: Able to declare two handlers for same condition in same scope
parent
e6d72f1c
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
170 additions
and
7 deletions
+170
-7
mysql-test/r/sp-error.result
mysql-test/r/sp-error.result
+41
-0
mysql-test/t/sp-error.test
mysql-test/t/sp-error.test
+50
-0
sql/share/errmsg.txt
sql/share/errmsg.txt
+2
-1
sql/sp_pcontext.cc
sql/sp_pcontext.cc
+37
-0
sql/sp_pcontext.h
sql/sp_pcontext.h
+10
-0
sql/sql_yacc.yy
sql/sql_yacc.yy
+30
-6
No files found.
mysql-test/r/sp-error.result
View file @
2038ced4
...
@@ -526,4 +526,45 @@ delete from t1|
...
@@ -526,4 +526,45 @@ delete from t1|
call bug7299()|
call bug7299()|
ERROR 02000: No data to FETCH
ERROR 02000: No data to FETCH
drop procedure bug7299|
drop procedure bug7299|
create procedure bug9073()
begin
declare continue handler for sqlexception select 1;
declare continue handler for sqlexception select 2;
end|
ERROR 42000: Duplicate handler declared in the same block
create procedure bug9073()
begin
declare condname1 condition for 1234;
declare continue handler for condname1 select 1;
declare exit handler for condname1 select 2;
end|
ERROR 42000: Duplicate handler declared in the same block
create procedure bug9073()
begin
declare condname1 condition for sqlstate '42000';
declare condname2 condition for sqlstate '42000';
declare exit handler for condname1 select 1;
declare continue handler for condname2 select 2;
end|
ERROR 42000: Duplicate handler declared in the same block
create procedure bug9073()
begin
declare condname1 condition for sqlstate '42000';
declare exit handler for condname1 select 1;
declare exit handler for sqlstate '42000' select 2;
end|
ERROR 42000: Duplicate handler declared in the same block
drop procedure if exists bug9073|
create procedure bug9073()
begin
declare condname1 condition for sqlstate '42000';
declare continue handler for condname1 select 1;
begin
declare exit handler for sqlstate '42000' select 2;
begin
declare continue handler for sqlstate '42000' select 3;
end;
end;
end|
drop procedure bug9073|
drop table t1|
drop table t1|
mysql-test/t/sp-error.test
View file @
2038ced4
...
@@ -742,6 +742,56 @@ call bug7299()|
...
@@ -742,6 +742,56 @@ call bug7299()|
drop
procedure
bug7299
|
drop
procedure
bug7299
|
#
# BUG#9073: Able to declare two handlers for same condition in same scope
#
--
error
ER_SP_DUP_HANDLER
create
procedure
bug9073
()
begin
declare
continue
handler
for
sqlexception
select
1
;
declare
continue
handler
for
sqlexception
select
2
;
end
|
--
error
ER_SP_DUP_HANDLER
create
procedure
bug9073
()
begin
declare
condname1
condition
for
1234
;
declare
continue
handler
for
condname1
select
1
;
declare
exit
handler
for
condname1
select
2
;
end
|
--
error
ER_SP_DUP_HANDLER
create
procedure
bug9073
()
begin
declare
condname1
condition
for
sqlstate
'42000'
;
declare
condname2
condition
for
sqlstate
'42000'
;
declare
exit
handler
for
condname1
select
1
;
declare
continue
handler
for
condname2
select
2
;
end
|
--
error
ER_SP_DUP_HANDLER
create
procedure
bug9073
()
begin
declare
condname1
condition
for
sqlstate
'42000'
;
declare
exit
handler
for
condname1
select
1
;
declare
exit
handler
for
sqlstate
'42000'
select
2
;
end
|
# This should still work.
--
disable_warnings
drop
procedure
if
exists
bug9073
|
--
enable_warnings
create
procedure
bug9073
()
begin
declare
condname1
condition
for
sqlstate
'42000'
;
declare
continue
handler
for
condname1
select
1
;
begin
declare
exit
handler
for
sqlstate
'42000'
select
2
;
begin
declare
continue
handler
for
sqlstate
'42000'
select
3
;
end
;
end
;
end
|
drop
procedure
bug9073
|
#
#
# BUG#NNNN: New bug synopsis
# BUG#NNNN: New bug synopsis
#
#
...
...
sql/share/errmsg.txt
View file @
2038ced4
...
@@ -5338,4 +5338,5 @@ ER_WRONG_VALUE_FOR_TYPE
...
@@ -5338,4 +5338,5 @@ ER_WRONG_VALUE_FOR_TYPE
eng "Incorrect %-.32s value: '%-.128s' for function %-.32s"
eng "Incorrect %-.32s value: '%-.128s' for function %-.32s"
ER_TABLE_DEF_CHANGED
ER_TABLE_DEF_CHANGED
eng "Table definition has changed, please retry transaction"
eng "Table definition has changed, please retry transaction"
ER_SP_DUP_HANDLER 42000
eng "Duplicate handler declared in the same block"
sql/sp_pcontext.cc
View file @
2038ced4
...
@@ -57,6 +57,7 @@ sp_pcontext::sp_pcontext(sp_pcontext *prev)
...
@@ -57,6 +57,7 @@ sp_pcontext::sp_pcontext(sp_pcontext *prev)
VOID
(
my_init_dynamic_array
(
&
m_pvar
,
sizeof
(
sp_pvar_t
*
),
16
,
8
));
VOID
(
my_init_dynamic_array
(
&
m_pvar
,
sizeof
(
sp_pvar_t
*
),
16
,
8
));
VOID
(
my_init_dynamic_array
(
&
m_cond
,
sizeof
(
sp_cond_type_t
*
),
16
,
8
));
VOID
(
my_init_dynamic_array
(
&
m_cond
,
sizeof
(
sp_cond_type_t
*
),
16
,
8
));
VOID
(
my_init_dynamic_array
(
&
m_cursor
,
sizeof
(
LEX_STRING
),
16
,
8
));
VOID
(
my_init_dynamic_array
(
&
m_cursor
,
sizeof
(
LEX_STRING
),
16
,
8
));
VOID
(
my_init_dynamic_array
(
&
m_handler
,
sizeof
(
sp_cond_type_t
*
),
16
,
8
));
m_label
.
empty
();
m_label
.
empty
();
m_children
.
empty
();
m_children
.
empty
();
if
(
!
prev
)
if
(
!
prev
)
...
@@ -82,6 +83,7 @@ sp_pcontext::destroy()
...
@@ -82,6 +83,7 @@ sp_pcontext::destroy()
delete_dynamic
(
&
m_pvar
);
delete_dynamic
(
&
m_pvar
);
delete_dynamic
(
&
m_cond
);
delete_dynamic
(
&
m_cond
);
delete_dynamic
(
&
m_cursor
);
delete_dynamic
(
&
m_cursor
);
delete_dynamic
(
&
m_handler
);
}
}
sp_pcontext
*
sp_pcontext
*
...
@@ -258,6 +260,41 @@ sp_pcontext::find_cond(LEX_STRING *name, my_bool scoped)
...
@@ -258,6 +260,41 @@ sp_pcontext::find_cond(LEX_STRING *name, my_bool scoped)
return
NULL
;
return
NULL
;
}
}
/*
* This only searches the current context, for error checking of
* duplicates.
* Returns TRUE if found.
*/
bool
sp_pcontext
::
find_handler
(
sp_cond_type_t
*
cond
)
{
uint
i
=
m_handler
.
elements
;
while
(
i
--
)
{
sp_cond_type_t
*
p
;
get_dynamic
(
&
m_handler
,
(
gptr
)
&
p
,
i
);
if
(
cond
->
type
==
p
->
type
)
{
switch
(
p
->
type
)
{
case
sp_cond_type_t
:
:
number
:
if
(
cond
->
mysqlerr
==
p
->
mysqlerr
)
return
TRUE
;
break
;
case
sp_cond_type_t
:
:
state
:
if
(
strcmp
(
cond
->
sqlstate
,
p
->
sqlstate
)
==
0
)
return
TRUE
;
break
;
default:
return
TRUE
;
}
}
}
return
FALSE
;
}
void
void
sp_pcontext
::
push_cursor
(
LEX_STRING
*
name
)
sp_pcontext
::
push_cursor
(
LEX_STRING
*
name
)
{
{
...
...
sql/sp_pcontext.h
View file @
2038ced4
...
@@ -241,6 +241,15 @@ class sp_pcontext : public Sql_alloc
...
@@ -241,6 +241,15 @@ class sp_pcontext : public Sql_alloc
m_handlers
+=
1
;
m_handlers
+=
1
;
}
}
inline
void
push_handler
(
sp_cond_type_t
*
cond
)
{
insert_dynamic
(
&
m_handler
,
(
gptr
)
&
cond
);
}
bool
find_handler
(
sp_cond_type
*
cond
);
inline
uint
inline
uint
max_handlers
()
max_handlers
()
{
{
...
@@ -293,6 +302,7 @@ private:
...
@@ -293,6 +302,7 @@ private:
DYNAMIC_ARRAY
m_pvar
;
// Parameters/variables
DYNAMIC_ARRAY
m_pvar
;
// Parameters/variables
DYNAMIC_ARRAY
m_cond
;
// Conditions
DYNAMIC_ARRAY
m_cond
;
// Conditions
DYNAMIC_ARRAY
m_cursor
;
// Cursors
DYNAMIC_ARRAY
m_cursor
;
// Cursors
DYNAMIC_ARRAY
m_handler
;
// Handlers, for checking of duplicates
List
<
sp_label_t
>
m_label
;
// The label list
List
<
sp_label_t
>
m_label
;
// The label list
...
...
sql/sql_yacc.yy
View file @
2038ced4
...
@@ -1774,19 +1774,43 @@ sp_hcond_list:
...
@@ -1774,19 +1774,43 @@ sp_hcond_list:
{
{
LEX *lex= Lex;
LEX *lex= Lex;
sp_head *sp= lex->sphead;
sp_head *sp= lex->sphead;
sp_
instr_hpush_jump *i= (sp_instr_hpush_jump *)sp->last_instruction()
;
sp_
pcontext *ctx= lex->spcont
;
i->add_condition($1);
if (ctx->find_handler($1))
$$= 1;
{
my_message(ER_SP_DUP_HANDLER, ER(ER_SP_DUP_HANDLER), MYF(0));
YYABORT;
}
else
{
sp_instr_hpush_jump *i=
(sp_instr_hpush_jump *)sp->last_instruction();
i->add_condition($1);
ctx->push_handler($1);
$$= 1;
}
}
}
| sp_hcond_list ',' sp_hcond
| sp_hcond_list ',' sp_hcond
{
{
LEX *lex= Lex;
LEX *lex= Lex;
sp_head *sp= lex->sphead;
sp_head *sp= lex->sphead;
sp_
instr_hpush_jump *i= (sp_instr_hpush_jump *)sp->last_instruction()
;
sp_
pcontext *ctx= lex->spcont
;
i->add_condition($3);
if (ctx->find_handler($3))
$$= $1 + 1;
{
my_message(ER_SP_DUP_HANDLER, ER(ER_SP_DUP_HANDLER), MYF(0));
YYABORT;
}
else
{
sp_instr_hpush_jump *i=
(sp_instr_hpush_jump *)sp->last_instruction();
i->add_condition($3);
ctx->push_handler($3);
$$= $1 + 1;
}
}
}
;
;
...
...
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