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
9ac57f01
Commit
9ac57f01
authored
Nov 27, 2008
by
Sergey Glukhov
Browse files
Options
Browse Files
Download
Plain Diff
5.0-bugteam->5.1-bugteam merge
parents
910d4172
89d04406
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
93 additions
and
0 deletions
+93
-0
mysql-test/r/subselect.result
mysql-test/r/subselect.result
+30
-0
mysql-test/t/subselect.test
mysql-test/t/subselect.test
+36
-0
sql/mysql_priv.h
sql/mysql_priv.h
+1
-0
sql/sql_update.cc
sql/sql_update.cc
+26
-0
No files found.
mysql-test/r/subselect.result
View file @
9ac57f01
...
...
@@ -4448,4 +4448,34 @@ SELECT t1.a, (SELECT 1 FROM t2 WHERE t2.b=t3.c AND t2.c=t1.a ORDER BY t2.d LIMIT
a incorrect
1 1
DROP TABLE t1,t2,t3;
CREATE TABLE t1 (id int);
CREATE TABLE t2 (id int, c int);
INSERT INTO t1 (id) VALUES (1);
INSERT INTO t2 (id) VALUES (1);
INSERT INTO t1 (id) VALUES (1);
INSERT INTO t2 (id) VALUES (1);
CREATE VIEW v1 AS
SELECT t2.c AS c FROM t1, t2
WHERE t1.id=t2.id AND 1 IN (SELECT id FROM t1) WITH CHECK OPTION;
UPDATE v1 SET c=1;
CREATE VIEW v2 (a,b) AS
SELECT t2.id, t2.c AS c FROM t1, t2
WHERE t1.id=t2.id AND 1 IN (SELECT id FROM t1) WITH CHECK OPTION;
INSERT INTO v2(a,b) VALUES (2,2);
ERROR HY000: CHECK OPTION failed 'test.v2'
INSERT INTO v2(a,b) VALUES (1,2);
SELECT * FROM v1;
c
1
1
1
1
2
2
CREATE VIEW v3 AS
SELECT t2.c AS c FROM t2
WHERE 1 IN (SELECT id FROM t1) WITH CHECK OPTION;
DELETE FROM v3;
DROP VIEW v1,v2,v3;
DROP TABLE t1,t2;
End of 5.1 tests.
mysql-test/t/subselect.test
View file @
9ac57f01
...
...
@@ -3355,4 +3355,40 @@ SELECT t1.a, (SELECT 1 FROM t2 WHERE t2.b=t3.c AND t2.c=t1.a ORDER BY t2.d LIMIT
SELECT
t1
.
a
,
(
SELECT
1
FROM
t2
WHERE
t2
.
b
=
t3
.
c
AND
t2
.
c
=
t1
.
a
ORDER
BY
t2
.
d
LIMIT
1
)
AS
incorrect
FROM
t1
,
t3
WHERE
t3
.
b
=
t1
.
a
;
DROP
TABLE
t1
,
t2
,
t3
;
#
# Bug#37460 Assertion failed:
# !table->file || table->file->inited == handler::NONE
#
CREATE
TABLE
t1
(
id
int
);
CREATE
TABLE
t2
(
id
int
,
c
int
);
INSERT
INTO
t1
(
id
)
VALUES
(
1
);
INSERT
INTO
t2
(
id
)
VALUES
(
1
);
INSERT
INTO
t1
(
id
)
VALUES
(
1
);
INSERT
INTO
t2
(
id
)
VALUES
(
1
);
CREATE
VIEW
v1
AS
SELECT
t2
.
c
AS
c
FROM
t1
,
t2
WHERE
t1
.
id
=
t2
.
id
AND
1
IN
(
SELECT
id
FROM
t1
)
WITH
CHECK
OPTION
;
UPDATE
v1
SET
c
=
1
;
CREATE
VIEW
v2
(
a
,
b
)
AS
SELECT
t2
.
id
,
t2
.
c
AS
c
FROM
t1
,
t2
WHERE
t1
.
id
=
t2
.
id
AND
1
IN
(
SELECT
id
FROM
t1
)
WITH
CHECK
OPTION
;
--
error
1369
INSERT
INTO
v2
(
a
,
b
)
VALUES
(
2
,
2
);
INSERT
INTO
v2
(
a
,
b
)
VALUES
(
1
,
2
);
SELECT
*
FROM
v1
;
CREATE
VIEW
v3
AS
SELECT
t2
.
c
AS
c
FROM
t2
WHERE
1
IN
(
SELECT
id
FROM
t1
)
WITH
CHECK
OPTION
;
DELETE
FROM
v3
;
DROP
VIEW
v1
,
v2
,
v3
;
DROP
TABLE
t1
,
t2
;
--
echo
End
of
5.1
tests
.
sql/mysql_priv.h
View file @
9ac57f01
...
...
@@ -548,6 +548,7 @@ protected:
#define UNCACHEABLE_PREPARE 16
/* For uncorrelated SELECT in an UNION with some correlated SELECTs */
#define UNCACHEABLE_UNITED 32
#define UNCACHEABLE_CHECKOPTION 64
/* Used to check GROUP BY list in the MODE_ONLY_FULL_GROUP_BY mode */
#define UNDEF_POS (-1)
...
...
sql/sql_update.cc
View file @
9ac57f01
...
...
@@ -1470,6 +1470,32 @@ multi_update::initialize_tables(JOIN *join)
}
table
->
prepare_for_position
();
/*
enable uncacheable flag if we update a view with check option
and check option has a subselect, otherwise, the check option
can be evaluated after the subselect was freed as independent
(See full_local in JOIN::join_free()).
*/
if
(
table_ref
->
check_option
&&
!
join
->
select_lex
->
uncacheable
)
{
SELECT_LEX_UNIT
*
tmp_unit
;
SELECT_LEX
*
sl
;
for
(
tmp_unit
=
join
->
select_lex
->
first_inner_unit
();
tmp_unit
;
tmp_unit
=
tmp_unit
->
next_unit
())
{
for
(
sl
=
tmp_unit
->
first_select
();
sl
;
sl
=
sl
->
next_select
())
{
if
(
sl
->
master_unit
()
->
item
)
{
join
->
select_lex
->
uncacheable
|=
UNCACHEABLE_CHECKOPTION
;
goto
loop_end
;
}
}
}
}
loop_end:
if
(
table
==
first_table_for_update
&&
table_ref
->
check_option
)
{
table_map
unupdated_tables
=
table_ref
->
check_option
->
used_tables
()
&
...
...
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