auto-merge
This commit is contained in:
commit
ff50b26457
@ -24,8 +24,8 @@ EXTRA_DIST = $(man1_MANS) $(man8_MANS)
|
||||
# 1) not needed in Unix binary packages,
|
||||
# 2) programs not generated in 5.0:
|
||||
install-data-hook:
|
||||
rm -f $(DESTDIR)$(manlibdir)/man1/make_win_*
|
||||
rm -f $(DESTDIR)$(manlibdir)/man1/ndb_print_*
|
||||
rm -f $(DESTDIR)$(mandir)/man1/make_win_*
|
||||
rm -f $(DESTDIR)$(mandir)/man1/ndb_print_*
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
||||
|
@ -4474,4 +4474,32 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY C ALL NULL NULL NULL NULL 20 Using where
|
||||
DROP TABLE C;
|
||||
# End of test for bug#45061.
|
||||
#
|
||||
# Bug #46749: Segfault in add_key_fields() with outer subquery level
|
||||
# field references
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
a int,
|
||||
b int,
|
||||
UNIQUE (a), KEY (b)
|
||||
);
|
||||
INSERT INTO t1 VALUES (1,1), (2,1);
|
||||
CREATE TABLE st1 like t1;
|
||||
INSERT INTO st1 VALUES (1,1), (2,1);
|
||||
CREATE TABLE st2 like t1;
|
||||
INSERT INTO st2 VALUES (1,1), (2,1);
|
||||
EXPLAIN
|
||||
SELECT MAX(b), (SELECT COUNT(*) FROM st1,st2 WHERE st2.b <= t1.b)
|
||||
FROM t1
|
||||
WHERE a = 230;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
2 DEPENDENT SUBQUERY st1 index NULL a 5 NULL 2 Using index
|
||||
2 DEPENDENT SUBQUERY st2 index b b 5 NULL 2 Using where; Using index
|
||||
SELECT MAX(b), (SELECT COUNT(*) FROM st1,st2 WHERE st2.b <= t1.b)
|
||||
FROM t1
|
||||
WHERE a = 230;
|
||||
MAX(b) (SELECT COUNT(*) FROM st1,st2 WHERE st2.b <= t1.b)
|
||||
NULL 0
|
||||
DROP TABLE t1, st1, st2;
|
||||
End of 5.0 tests.
|
||||
|
@ -3704,117 +3704,6 @@ SELECT * FROM v1 IGNORE INDEX (c2) WHERE c2=2;
|
||||
ERROR HY000: Key 'c2' doesn't exist in table 'v1'
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug #45806 crash when replacing into a view with a join!
|
||||
#
|
||||
CREATE TABLE t1(a INT UNIQUE);
|
||||
CREATE VIEW v1 AS SELECT t1.a FROM t1, t1 AS a;
|
||||
INSERT INTO t1 VALUES (1), (2);
|
||||
REPLACE INTO v1(a) SELECT 1 FROM t1,t1 AS c;
|
||||
SELECT * FROM v1;
|
||||
a
|
||||
1
|
||||
2
|
||||
1
|
||||
2
|
||||
REPLACE INTO v1(a) SELECT 3 FROM t1,t1 AS c;
|
||||
SELECT * FROM v1;
|
||||
a
|
||||
1
|
||||
2
|
||||
3
|
||||
1
|
||||
2
|
||||
3
|
||||
1
|
||||
2
|
||||
3
|
||||
DELETE FROM t1 WHERE a=3;
|
||||
INSERT INTO v1(a) SELECT 1 FROM t1,t1 AS c
|
||||
ON DUPLICATE KEY UPDATE `v1`.`a`= 1;
|
||||
SELECT * FROM v1;
|
||||
a
|
||||
1
|
||||
2
|
||||
1
|
||||
2
|
||||
CREATE VIEW v2 AS SELECT t1.a FROM t1, v1 AS a;
|
||||
REPLACE INTO v2(a) SELECT 1 FROM t1,t1 AS c;
|
||||
SELECT * FROM v2;
|
||||
a
|
||||
1
|
||||
2
|
||||
1
|
||||
2
|
||||
1
|
||||
2
|
||||
1
|
||||
2
|
||||
REPLACE INTO v2(a) SELECT 3 FROM t1,t1 AS c;
|
||||
SELECT * FROM v2;
|
||||
a
|
||||
1
|
||||
2
|
||||
3
|
||||
1
|
||||
2
|
||||
3
|
||||
1
|
||||
2
|
||||
3
|
||||
1
|
||||
2
|
||||
3
|
||||
1
|
||||
2
|
||||
3
|
||||
1
|
||||
2
|
||||
3
|
||||
1
|
||||
2
|
||||
3
|
||||
1
|
||||
2
|
||||
3
|
||||
1
|
||||
2
|
||||
3
|
||||
INSERT INTO v2(a) SELECT 1 FROM t1,t1 AS c
|
||||
ON DUPLICATE KEY UPDATE `v2`.`a`= 1;
|
||||
SELECT * FROM v2;
|
||||
a
|
||||
1
|
||||
2
|
||||
3
|
||||
1
|
||||
2
|
||||
3
|
||||
1
|
||||
2
|
||||
3
|
||||
1
|
||||
2
|
||||
3
|
||||
1
|
||||
2
|
||||
3
|
||||
1
|
||||
2
|
||||
3
|
||||
1
|
||||
2
|
||||
3
|
||||
1
|
||||
2
|
||||
3
|
||||
1
|
||||
2
|
||||
3
|
||||
DROP VIEW v1;
|
||||
DROP VIEW v2;
|
||||
DROP TABLE t1;
|
||||
# -- End of test case for Bug#45806
|
||||
# -----------------------------------------------------------------
|
||||
# -- Bug#40825: Error 1356 while selecting from a view
|
||||
# -- with a "HAVING" clause though query works
|
||||
|
@ -3450,4 +3450,35 @@ DROP TABLE C;
|
||||
--echo # End of test for bug#45061.
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Bug #46749: Segfault in add_key_fields() with outer subquery level
|
||||
--echo # field references
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (
|
||||
a int,
|
||||
b int,
|
||||
UNIQUE (a), KEY (b)
|
||||
);
|
||||
INSERT INTO t1 VALUES (1,1), (2,1);
|
||||
|
||||
CREATE TABLE st1 like t1;
|
||||
INSERT INTO st1 VALUES (1,1), (2,1);
|
||||
|
||||
CREATE TABLE st2 like t1;
|
||||
INSERT INTO st2 VALUES (1,1), (2,1);
|
||||
|
||||
# should have "impossible where"
|
||||
EXPLAIN
|
||||
SELECT MAX(b), (SELECT COUNT(*) FROM st1,st2 WHERE st2.b <= t1.b)
|
||||
FROM t1
|
||||
WHERE a = 230;
|
||||
|
||||
# should not crash
|
||||
SELECT MAX(b), (SELECT COUNT(*) FROM st1,st2 WHERE st2.b <= t1.b)
|
||||
FROM t1
|
||||
WHERE a = 230;
|
||||
|
||||
DROP TABLE t1, st1, st2;
|
||||
|
||||
--echo End of 5.0 tests.
|
||||
|
@ -3680,38 +3680,6 @@ SELECT * FROM v1 IGNORE INDEX (c2) WHERE c2=2;
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # Bug #45806 crash when replacing into a view with a join!
|
||||
--echo #
|
||||
CREATE TABLE t1(a INT UNIQUE);
|
||||
CREATE VIEW v1 AS SELECT t1.a FROM t1, t1 AS a;
|
||||
INSERT INTO t1 VALUES (1), (2);
|
||||
|
||||
REPLACE INTO v1(a) SELECT 1 FROM t1,t1 AS c;
|
||||
SELECT * FROM v1;
|
||||
REPLACE INTO v1(a) SELECT 3 FROM t1,t1 AS c;
|
||||
SELECT * FROM v1;
|
||||
DELETE FROM t1 WHERE a=3;
|
||||
INSERT INTO v1(a) SELECT 1 FROM t1,t1 AS c
|
||||
ON DUPLICATE KEY UPDATE `v1`.`a`= 1;
|
||||
SELECT * FROM v1;
|
||||
|
||||
CREATE VIEW v2 AS SELECT t1.a FROM t1, v1 AS a;
|
||||
|
||||
REPLACE INTO v2(a) SELECT 1 FROM t1,t1 AS c;
|
||||
SELECT * FROM v2;
|
||||
REPLACE INTO v2(a) SELECT 3 FROM t1,t1 AS c;
|
||||
SELECT * FROM v2;
|
||||
INSERT INTO v2(a) SELECT 1 FROM t1,t1 AS c
|
||||
ON DUPLICATE KEY UPDATE `v2`.`a`= 1;
|
||||
SELECT * FROM v2;
|
||||
|
||||
DROP VIEW v1;
|
||||
DROP VIEW v2;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo # -- End of test case for Bug#45806
|
||||
|
||||
--echo # -----------------------------------------------------------------
|
||||
--echo # -- Bug#40825: Error 1356 while selecting from a view
|
||||
--echo # -- with a "HAVING" clause though query works
|
||||
|
@ -233,10 +233,13 @@ int init_io_cache(IO_CACHE *info, File file, uint cachesize,
|
||||
buffer_block = cachesize;
|
||||
if (type == SEQ_READ_APPEND)
|
||||
buffer_block *= 2;
|
||||
if ((info->buffer=
|
||||
(byte*) my_malloc(buffer_block,
|
||||
MYF((cache_myflags & ~ MY_WME) |
|
||||
(cachesize == min_cache ? MY_WME : 0)))) != 0)
|
||||
/*
|
||||
Unset MY_WAIT_IF_FULL bit if it is set, to prevent conflict with
|
||||
MY_ZEROFILL.
|
||||
*/
|
||||
myf flag = MYF((cache_myflags & ~ (MY_WME | MY_WAIT_IF_FULL)) |
|
||||
(cachesize == min_cache ? MY_WME : 0));
|
||||
if ((info->buffer= (byte*) my_malloc(buffer_block, flag)) != 0)
|
||||
{
|
||||
info->write_buffer=info->buffer;
|
||||
if (type == SEQ_READ_APPEND)
|
||||
|
@ -3207,6 +3207,28 @@ add_key_equal_fields(KEY_FIELD **key_fields, uint and_level,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Check if an expression is a non-outer field.
|
||||
|
||||
Checks if an expression is a field and belongs to the current select.
|
||||
|
||||
@param field Item expression to check
|
||||
|
||||
@return boolean
|
||||
@retval TRUE the expression is a local field
|
||||
@retval FALSE it's something else
|
||||
*/
|
||||
|
||||
inline static bool
|
||||
is_local_field (Item *field)
|
||||
{
|
||||
field= field->real_item();
|
||||
return field->type() == Item::FIELD_ITEM &&
|
||||
!((Item_field *)field)->depended_from;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
add_key_fields(JOIN *join, KEY_FIELD **key_fields, uint *and_level,
|
||||
COND *cond, table_map usable_tables,
|
||||
@ -3282,13 +3304,12 @@ add_key_fields(JOIN *join, KEY_FIELD **key_fields, uint *and_level,
|
||||
{
|
||||
Item **values;
|
||||
// BETWEEN, IN, NE
|
||||
if (cond_func->key_item()->real_item()->type() == Item::FIELD_ITEM &&
|
||||
if (is_local_field (cond_func->key_item()) &&
|
||||
!(cond_func->used_tables() & OUTER_REF_TABLE_BIT))
|
||||
{
|
||||
values= cond_func->arguments()+1;
|
||||
if (cond_func->functype() == Item_func::NE_FUNC &&
|
||||
cond_func->arguments()[1]->real_item()->type() == Item::FIELD_ITEM &&
|
||||
!(cond_func->arguments()[0]->used_tables() & OUTER_REF_TABLE_BIT))
|
||||
is_local_field (cond_func->arguments()[1]))
|
||||
values--;
|
||||
DBUG_ASSERT(cond_func->functype() != Item_func::IN_FUNC ||
|
||||
cond_func->argument_count() != 2);
|
||||
@ -3304,9 +3325,7 @@ add_key_fields(JOIN *join, KEY_FIELD **key_fields, uint *and_level,
|
||||
for (uint i= 1 ; i < cond_func->argument_count() ; i++)
|
||||
{
|
||||
Item_field *field_item;
|
||||
if (cond_func->arguments()[i]->real_item()->type() == Item::FIELD_ITEM
|
||||
&&
|
||||
!(cond_func->arguments()[i]->used_tables() & OUTER_REF_TABLE_BIT))
|
||||
if (is_local_field (cond_func->arguments()[i]))
|
||||
{
|
||||
field_item= (Item_field *) (cond_func->arguments()[i]->real_item());
|
||||
add_key_equal_fields(key_fields, *and_level, cond_func,
|
||||
@ -3322,8 +3341,7 @@ add_key_fields(JOIN *join, KEY_FIELD **key_fields, uint *and_level,
|
||||
bool equal_func=(cond_func->functype() == Item_func::EQ_FUNC ||
|
||||
cond_func->functype() == Item_func::EQUAL_FUNC);
|
||||
|
||||
if (cond_func->arguments()[0]->real_item()->type() == Item::FIELD_ITEM &&
|
||||
!(cond_func->arguments()[0]->used_tables() & OUTER_REF_TABLE_BIT))
|
||||
if (is_local_field (cond_func->arguments()[0]))
|
||||
{
|
||||
add_key_equal_fields(key_fields, *and_level, cond_func,
|
||||
(Item_field*) (cond_func->arguments()[0])->real_item(),
|
||||
@ -3331,9 +3349,8 @@ add_key_fields(JOIN *join, KEY_FIELD **key_fields, uint *and_level,
|
||||
cond_func->arguments()+1, 1, usable_tables,
|
||||
sargables);
|
||||
}
|
||||
if (cond_func->arguments()[1]->real_item()->type() == Item::FIELD_ITEM &&
|
||||
cond_func->functype() != Item_func::LIKE_FUNC &&
|
||||
!(cond_func->arguments()[1]->used_tables() & OUTER_REF_TABLE_BIT))
|
||||
if (is_local_field (cond_func->arguments()[1]) &&
|
||||
cond_func->functype() != Item_func::LIKE_FUNC)
|
||||
{
|
||||
add_key_equal_fields(key_fields, *and_level, cond_func,
|
||||
(Item_field*) (cond_func->arguments()[1])->real_item(),
|
||||
@ -3345,7 +3362,7 @@ add_key_fields(JOIN *join, KEY_FIELD **key_fields, uint *and_level,
|
||||
}
|
||||
case Item_func::OPTIMIZE_NULL:
|
||||
/* column_name IS [NOT] NULL */
|
||||
if (cond_func->arguments()[0]->real_item()->type() == Item::FIELD_ITEM &&
|
||||
if (is_local_field (cond_func->arguments()[0]) &&
|
||||
!(cond_func->used_tables() & OUTER_REF_TABLE_BIT))
|
||||
{
|
||||
Item *tmp=new Item_null;
|
||||
|
Loading…
x
Reference in New Issue
Block a user