Commit fbafa42b authored by unknown's avatar unknown

Fixed bug #19396: a crash for a an outer join operation

over two views when using syntax with curly braces.
Each outer join operation must be placed in a separate
nest. This was not done when the syntax with curly braces
was used. In some cases, in particular, for queries with outer
join operation over views it could cause a crash.


mysql-test/r/join_outer.result:
  Added a test case for bug #19396.
mysql-test/t/join_outer.test:
  Added a test case for bug #19396.
parent e7f87bd0
...@@ -1154,3 +1154,25 @@ id select_type table type possible_keys key key_len ref rows Extra ...@@ -1154,3 +1154,25 @@ id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index PRIMARY,name name 23 NULL 3 Using where; Using index 1 SIMPLE t1 index PRIMARY,name name 23 NULL 3 Using where; Using index
1 SIMPLE t2 ref fkey fkey 5 test.t1.id 1 Using where; Using index 1 SIMPLE t2 ref fkey fkey 5 test.t1.id 1 Using where; Using index
DROP TABLE t1,t2; DROP TABLE t1,t2;
DROP VIEW IF EXISTS v1,v2;
DROP TABLE IF EXISTS t1,t2;
CREATE TABLE t1 (a int);
CREATE table t2 (b int);
INSERT INTO t1 VALUES (1), (2), (3), (4), (1), (1), (3);
INSERT INTO t2 VALUES (2), (3);
CREATE VIEW v1 AS SELECT a FROM t1 JOIN t2 ON t1.a=t2.b;
CREATE VIEW v2 AS SELECT b FROM t2 JOIN t1 ON t2.b=t1.a;
SELECT v1.a, v2. b
FROM v1 LEFT OUTER JOIN v2 ON (v1.a=v2.b) AND (v1.a >= 3)
GROUP BY v1.a;
a b
2 NULL
3 3
SELECT v1.a, v2. b
FROM { OJ v1 LEFT OUTER JOIN v2 ON (v1.a=v2.b) AND (v1.a >= 3) }
GROUP BY v1.a;
a b
2 NULL
3 3
DROP VIEW v1,v2;
DROP TABLE t1,t2;
...@@ -779,3 +779,29 @@ SELECT COUNT(*) FROM t2 LEFT JOIN t1 ON t2.fkey = t1.id ...@@ -779,3 +779,29 @@ SELECT COUNT(*) FROM t2 LEFT JOIN t1 ON t2.fkey = t1.id
WHERE t1.name LIKE 'A%' OR FALSE; WHERE t1.name LIKE 'A%' OR FALSE;
DROP TABLE t1,t2; DROP TABLE t1,t2;
#
# Bug 19396: LEFT OUTER JOIN over views in curly braces
#
--disable_warnings
DROP VIEW IF EXISTS v1,v2;
DROP TABLE IF EXISTS t1,t2;
--enable_warnings
CREATE TABLE t1 (a int);
CREATE table t2 (b int);
INSERT INTO t1 VALUES (1), (2), (3), (4), (1), (1), (3);
INSERT INTO t2 VALUES (2), (3);
CREATE VIEW v1 AS SELECT a FROM t1 JOIN t2 ON t1.a=t2.b;
CREATE VIEW v2 AS SELECT b FROM t2 JOIN t1 ON t2.b=t1.a;
SELECT v1.a, v2. b
FROM v1 LEFT OUTER JOIN v2 ON (v1.a=v2.b) AND (v1.a >= 3)
GROUP BY v1.a;
SELECT v1.a, v2. b
FROM { OJ v1 LEFT OUTER JOIN v2 ON (v1.a=v2.b) AND (v1.a >= 3) }
GROUP BY v1.a;
DROP VIEW v1,v2;
DROP TABLE t1,t2;
...@@ -448,6 +448,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); ...@@ -448,6 +448,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
%token NUMERIC_SYM %token NUMERIC_SYM
%token NVARCHAR_SYM %token NVARCHAR_SYM
%token OFFSET_SYM %token OFFSET_SYM
%token OJ_SYM
%token OLD_PASSWORD %token OLD_PASSWORD
%token ON %token ON
%token ONE_SHOT_SYM %token ONE_SHOT_SYM
...@@ -5246,11 +5247,14 @@ table_factor: ...@@ -5246,11 +5247,14 @@ table_factor:
} }
expr '}' expr '}'
{ {
LEX *lex= Lex;
YYERROR_UNLESS($3 && $7); YYERROR_UNLESS($3 && $7);
add_join_on($7,$10); add_join_on($7,$10);
Lex->pop_context(); Lex->pop_context();
$7->outer_join|=JOIN_TYPE_LEFT; $7->outer_join|=JOIN_TYPE_LEFT;
$$=$7; $$=$7;
if (!($$= lex->current_select->nest_last_join(lex->thd)))
YYABORT;
} }
| select_derived_init get_select_lex select_derived2 | select_derived_init get_select_lex select_derived2
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment