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
374b9182
Commit
374b9182
authored
Jul 13, 2005
by
konstantin@mysql.com
Browse files
Options
Browse Files
Download
Plain Diff
Merge bk-internal.mysql.com:/home/bk/mysql-4.1
into mysql.com:/opt/local/work/mysql-4.1-11458
parents
1826c398
bef558b7
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
146 additions
and
34 deletions
+146
-34
mysql-test/r/ps.result
mysql-test/r/ps.result
+57
-0
mysql-test/t/ps.test
mysql-test/t/ps.test
+68
-0
sql/item.cc
sql/item.cc
+1
-28
sql/item.h
sql/item.h
+0
-1
sql/item_subselect.h
sql/item_subselect.h
+0
-1
sql/mysql_priv.h
sql/mysql_priv.h
+2
-0
sql/sql_lex.h
sql/sql_lex.h
+1
-0
sql/sql_parse.cc
sql/sql_parse.cc
+8
-0
sql/sql_prepare.cc
sql/sql_prepare.cc
+9
-4
No files found.
mysql-test/r/ps.result
View file @
374b9182
...
...
@@ -563,3 +563,60 @@ execute stmt;
execute stmt;
deallocate prepare stmt;
drop table t1;
create table t1 (
id int(11) unsigned not null primary key auto_increment,
partner_id varchar(35) not null,
t1_status_id int(10) unsigned
);
insert into t1 values ("1", "partner1", "10"), ("2", "partner2", "10"),
("3", "partner3", "10"), ("4", "partner4", "10");
create table t2 (
id int(11) unsigned not null default '0',
t1_line_id int(11) unsigned not null default '0',
article_id varchar(20),
sequence int(11) not null default '0',
primary key (id,t1_line_id)
);
insert into t2 values ("1", "1", "sup", "0"), ("2", "1", "sup", "1"),
("2", "2", "sup", "2"), ("2", "3", "sup", "3"),
("2", "4", "imp", "4"), ("3", "1", "sup", "0"),
("4", "1", "sup", "0");
create table t3 (
id int(11) not null default '0',
preceeding_id int(11) not null default '0',
primary key (id,preceeding_id)
);
create table t4 (
user_id varchar(50) not null,
article_id varchar(20) not null,
primary key (user_id,article_id)
);
insert into t4 values("nicke", "imp");
prepare stmt from
'select distinct t1.partner_id
from t1 left join t3 on t1.id = t3.id
left join t1 pp on pp.id = t3.preceeding_id
where
exists (
select *
from t2 as pl_inner
where pl_inner.id = t1.id
and pl_inner.sequence <= (
select min(sequence) from t2 pl_seqnr
where pl_seqnr.id = t1.id
)
and exists (
select * from t4
where t4.article_id = pl_inner.article_id
and t4.user_id = ?
)
)
and t1.id = ?
group by t1.id
having count(pp.id) = 0';
set @user_id = 'nicke';
set @id = '2';
execute stmt using @user_id, @id;
partner_id
execute stmt using @user_id, @id;
partner_id
mysql-test/t/ps.test
View file @
374b9182
...
...
@@ -581,3 +581,71 @@ execute stmt;
execute
stmt
;
deallocate
prepare
stmt
;
drop
table
t1
;
#
# Bug#11458 "Prepared statement with subselects return random data":
# drop PARAM_TABLE_BIT from the list of tables used by a subquery
#
create
table
t1
(
id
int
(
11
)
unsigned
not
null
primary
key
auto_increment
,
partner_id
varchar
(
35
)
not
null
,
t1_status_id
int
(
10
)
unsigned
);
insert
into
t1
values
(
"1"
,
"partner1"
,
"10"
),
(
"2"
,
"partner2"
,
"10"
),
(
"3"
,
"partner3"
,
"10"
),
(
"4"
,
"partner4"
,
"10"
);
create
table
t2
(
id
int
(
11
)
unsigned
not
null
default
'0'
,
t1_line_id
int
(
11
)
unsigned
not
null
default
'0'
,
article_id
varchar
(
20
),
sequence
int
(
11
)
not
null
default
'0'
,
primary
key
(
id
,
t1_line_id
)
);
insert
into
t2
values
(
"1"
,
"1"
,
"sup"
,
"0"
),
(
"2"
,
"1"
,
"sup"
,
"1"
),
(
"2"
,
"2"
,
"sup"
,
"2"
),
(
"2"
,
"3"
,
"sup"
,
"3"
),
(
"2"
,
"4"
,
"imp"
,
"4"
),
(
"3"
,
"1"
,
"sup"
,
"0"
),
(
"4"
,
"1"
,
"sup"
,
"0"
);
create
table
t3
(
id
int
(
11
)
not
null
default
'0'
,
preceeding_id
int
(
11
)
not
null
default
'0'
,
primary
key
(
id
,
preceeding_id
)
);
create
table
t4
(
user_id
varchar
(
50
)
not
null
,
article_id
varchar
(
20
)
not
null
,
primary
key
(
user_id
,
article_id
)
);
insert
into
t4
values
(
"nicke"
,
"imp"
);
prepare
stmt
from
'select distinct t1.partner_id
from t1 left join t3 on t1.id = t3.id
left join t1 pp on pp.id = t3.preceeding_id
where
exists (
select *
from t2 as pl_inner
where pl_inner.id = t1.id
and pl_inner.sequence <= (
select min(sequence) from t2 pl_seqnr
where pl_seqnr.id = t1.id
)
and exists (
select * from t4
where t4.article_id = pl_inner.article_id
and t4.user_id = ?
)
)
and t1.id = ?
group by t1.id
having count(pp.id) = 0'
;
set
@
user_id
=
'nicke'
;
set
@
id
=
'2'
;
execute
stmt
using
@
user_id
,
@
id
;
execute
stmt
using
@
user_id
,
@
id
;
sql/item.cc
View file @
374b9182
...
...
@@ -889,6 +889,7 @@ void Item_param::set_null()
max_length
=
0
;
decimals
=
0
;
state
=
NULL_VALUE
;
item_type
=
Item
::
NULL_ITEM
;
DBUG_VOID_RETURN
;
}
...
...
@@ -1339,34 +1340,6 @@ bool Item_param::convert_str_value(THD *thd)
return
rc
;
}
bool
Item_param
::
fix_fields
(
THD
*
thd
,
TABLE_LIST
*
tables
,
Item
**
ref
)
{
DBUG_ASSERT
(
fixed
==
0
);
SELECT_LEX
*
cursel
=
(
SELECT_LEX
*
)
thd
->
lex
->
current_select
;
/*
Parameters in a subselect should mark the subselect as not constant
during prepare
*/
if
(
state
==
NO_VALUE
)
{
/*
SELECT_LEX_UNIT::item set only for subqueries, so test of it presence
can be barrier to stop before derived table SELECT or very outer SELECT
*/
for
(;
cursel
->
master_unit
()
->
item
;
cursel
=
cursel
->
outer_select
())
{
Item_subselect
*
subselect_item
=
cursel
->
master_unit
()
->
item
;
subselect_item
->
used_tables_cache
|=
OUTER_REF_TABLE_BIT
;
subselect_item
->
const_item_cache
=
0
;
}
}
fixed
=
1
;
return
0
;
}
bool
Item_param
::
basic_const_item
()
const
{
...
...
sql/item.h
View file @
374b9182
...
...
@@ -564,7 +564,6 @@ class Item_param :public Item
bool
get_time
(
TIME
*
tm
);
bool
get_date
(
TIME
*
tm
,
uint
fuzzydate
);
int
save_in_field
(
Field
*
field
,
bool
no_conversions
);
bool
fix_fields
(
THD
*
,
struct
st_table_list
*
,
Item
**
);
void
set_null
();
void
set_int
(
longlong
i
,
uint32
max_length_arg
);
...
...
sql/item_subselect.h
View file @
374b9182
...
...
@@ -119,7 +119,6 @@ class Item_subselect :public Item_result_field
friend
class
Item_in_optimizer
;
friend
bool
Item_field
::
fix_fields
(
THD
*
,
TABLE_LIST
*
,
Item
**
);
friend
bool
Item_ref
::
fix_fields
(
THD
*
,
TABLE_LIST
*
,
Item
**
);
friend
bool
Item_param
::
fix_fields
(
THD
*
,
TABLE_LIST
*
,
Item
**
);
};
/* single value subselect */
...
...
sql/mysql_priv.h
View file @
374b9182
...
...
@@ -251,6 +251,8 @@ extern CHARSET_INFO *national_charset_info, *table_alias_charset;
#define UNCACHEABLE_SIDEEFFECT 4
// forcing to save JOIN for explain
#define UNCACHEABLE_EXPLAIN 8
/* Don't evaluate subqueries in prepare even if they're not correlated */
#define UNCACHEABLE_PREPARE 16
#ifdef EXTRA_DEBUG
/*
...
...
sql/sql_lex.h
View file @
374b9182
...
...
@@ -257,6 +257,7 @@ class st_select_lex_node {
UNCACHEABLE_RAND
UNCACHEABLE_SIDEEFFECT
UNCACHEABLE_EXPLAIN
UNCACHEABLE_PREPARE
*/
uint8
uncacheable
;
enum
sub_select_type
linkage
;
...
...
sql/sql_parse.cc
View file @
374b9182
...
...
@@ -4123,6 +4123,14 @@ mysql_new_select(LEX *lex, bool move_down)
select_lex
->
select_number
=
++
lex
->
thd
->
select_number
;
select_lex
->
init_query
();
select_lex
->
init_select
();
/*
Don't evaluate this subquery during statement prepare even if
it's a constant one. The flag is switched off in the end of
mysql_stmt_prepare.
*/
if
(
lex
->
thd
->
current_arena
->
is_stmt_prepare
())
select_lex
->
uncacheable
|=
UNCACHEABLE_PREPARE
;
if
(
move_down
)
{
lex
->
subqueries
=
TRUE
;
...
...
sql/sql_prepare.cc
View file @
374b9182
...
...
@@ -1657,13 +1657,18 @@ int mysql_stmt_prepare(THD *thd, char *packet, uint packet_length,
{
stmt
->
setup_set_params
();
SELECT_LEX
*
sl
=
stmt
->
lex
->
all_selects_list
;
/*
Save WHERE clause pointers, because they may be changed during query
optimisation.
*/
for
(;
sl
;
sl
=
sl
->
next_select_in_list
())
{
/*
Save WHERE clause pointers, because they may be changed
during query optimisation.
*/
sl
->
prep_where
=
sl
->
where
;
/*
Switch off a temporary flag that prevents evaluation of
subqueries in statement prepare.
*/
sl
->
uncacheable
&=
~
UNCACHEABLE_PREPARE
;
}
stmt
->
state
=
Item_arena
::
PREPARED
;
}
...
...
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