Fix of LP BUG#777809
There are 2 volatile condition constructions AND/OR constructions and fields(references) when first good supported to be top elements of conditions because it is normal practice (see copy_andor_structure for example) fields without any expression in the condition is really rare and mostly useless case however it could lead to problems when optimiser changes/moves them unaware of other variables referring to them. An easy solution of this problem is just to replace single field in a condition with equivalent expression well supported by the server (<field> -> <field> != 0). mysql-test/r/view.result: New test added. mysql-test/t/view.test: New test added. sql/sql_parse.cc: <field> -> <field> != 0 sql/sql_yacc.yy: <field> -> <field> != 0
This commit is contained in:
parent
541469f7cb
commit
20a2e1d0ac
@ -3906,6 +3906,23 @@ SELECT * FROM v1;
|
|||||||
a
|
a
|
||||||
DROP VIEW v1;
|
DROP VIEW v1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
|
# LP BUG#777809 (a retrograded condition for view ON)
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 ( f1 int NOT NULL , f6 int NOT NULL ) ;
|
||||||
|
INSERT IGNORE INTO t1 VALUES (20, 2);
|
||||||
|
CREATE TABLE t2 ( f3 int NOT NULL ) ;
|
||||||
|
INSERT IGNORE INTO t2 VALUES (7);
|
||||||
|
CREATE OR REPLACE VIEW v2 AS SELECT * FROM t2;
|
||||||
|
PREPARE prep_stmt FROM 'SELECT t1.f6 FROM t1 RIGHT JOIN v2 ON v2.f3 WHERE t1.f1 != 0';
|
||||||
|
EXECUTE prep_stmt;
|
||||||
|
f6
|
||||||
|
2
|
||||||
|
EXECUTE prep_stmt;
|
||||||
|
f6
|
||||||
|
2
|
||||||
|
drop view v2;
|
||||||
|
drop table t1,t2;
|
||||||
# -----------------------------------------------------------------
|
# -----------------------------------------------------------------
|
||||||
# -- End of 5.1 tests.
|
# -- End of 5.1 tests.
|
||||||
# -----------------------------------------------------------------
|
# -----------------------------------------------------------------
|
||||||
|
@ -3953,6 +3953,26 @@ SELECT * FROM v1;
|
|||||||
DROP VIEW v1;
|
DROP VIEW v1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # LP BUG#777809 (a retrograded condition for view ON)
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1 ( f1 int NOT NULL , f6 int NOT NULL ) ;
|
||||||
|
INSERT IGNORE INTO t1 VALUES (20, 2);
|
||||||
|
|
||||||
|
CREATE TABLE t2 ( f3 int NOT NULL ) ;
|
||||||
|
INSERT IGNORE INTO t2 VALUES (7);
|
||||||
|
|
||||||
|
CREATE OR REPLACE VIEW v2 AS SELECT * FROM t2;
|
||||||
|
|
||||||
|
PREPARE prep_stmt FROM 'SELECT t1.f6 FROM t1 RIGHT JOIN v2 ON v2.f3 WHERE t1.f1 != 0';
|
||||||
|
|
||||||
|
EXECUTE prep_stmt;
|
||||||
|
EXECUTE prep_stmt;
|
||||||
|
|
||||||
|
drop view v2;
|
||||||
|
drop table t1,t2;
|
||||||
|
|
||||||
--echo # -----------------------------------------------------------------
|
--echo # -----------------------------------------------------------------
|
||||||
--echo # -- End of 5.1 tests.
|
--echo # -- End of 5.1 tests.
|
||||||
--echo # -----------------------------------------------------------------
|
--echo # -----------------------------------------------------------------
|
||||||
|
@ -6890,6 +6890,28 @@ push_new_name_resolution_context(THD *thd,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Fix condition which contains only field (f turns to f <> 0 )
|
||||||
|
|
||||||
|
@param cond The condition to fix
|
||||||
|
|
||||||
|
@return fixed condition
|
||||||
|
*/
|
||||||
|
|
||||||
|
Item *normalize_cond(Item *cond)
|
||||||
|
{
|
||||||
|
if (cond)
|
||||||
|
{
|
||||||
|
Item::Type type= cond->type();
|
||||||
|
if (type == Item::FIELD_ITEM || type == Item::REF_ITEM)
|
||||||
|
{
|
||||||
|
cond= new Item_func_ne(cond, new Item_int(0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cond;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Add an ON condition to the second operand of a JOIN ... ON.
|
Add an ON condition to the second operand of a JOIN ... ON.
|
||||||
|
|
||||||
@ -6908,6 +6930,7 @@ void add_join_on(TABLE_LIST *b, Item *expr)
|
|||||||
{
|
{
|
||||||
if (expr)
|
if (expr)
|
||||||
{
|
{
|
||||||
|
expr= normalize_cond(expr);
|
||||||
if (!b->on_expr)
|
if (!b->on_expr)
|
||||||
b->on_expr= expr;
|
b->on_expr= expr;
|
||||||
else
|
else
|
||||||
|
@ -9029,7 +9029,7 @@ where_clause:
|
|||||||
expr
|
expr
|
||||||
{
|
{
|
||||||
SELECT_LEX *select= Select;
|
SELECT_LEX *select= Select;
|
||||||
select->where= $3;
|
select->where= normalize_cond($3);
|
||||||
select->parsing_place= NO_MATTER;
|
select->parsing_place= NO_MATTER;
|
||||||
if ($3)
|
if ($3)
|
||||||
$3->top_level_item();
|
$3->top_level_item();
|
||||||
@ -9045,7 +9045,7 @@ having_clause:
|
|||||||
expr
|
expr
|
||||||
{
|
{
|
||||||
SELECT_LEX *sel= Select;
|
SELECT_LEX *sel= Select;
|
||||||
sel->having= $3;
|
sel->having= normalize_cond($3);
|
||||||
sel->parsing_place= NO_MATTER;
|
sel->parsing_place= NO_MATTER;
|
||||||
if ($3)
|
if ($3)
|
||||||
$3->top_level_item();
|
$3->top_level_item();
|
||||||
@ -10483,7 +10483,7 @@ wild_and_where:
|
|||||||
}
|
}
|
||||||
| WHERE expr
|
| WHERE expr
|
||||||
{
|
{
|
||||||
Select->where= $2;
|
Select->where= normalize_cond($2);
|
||||||
if ($2)
|
if ($2)
|
||||||
$2->top_level_item();
|
$2->top_level_item();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user