diff options
author | Oleksandr Byelkin <sanja@mariadb.com> | 2019-07-26 22:42:35 +0200 |
---|---|---|
committer | Oleksandr Byelkin <sanja@mariadb.com> | 2019-07-26 22:42:35 +0200 |
commit | d97342b6f2cfdd55eb0f82b390ebc89c5997c382 (patch) | |
tree | 238dbb11c51a2352c99de198586b84f260b3aad9 /sql/sql_yacc.yy | |
parent | 00a254cc069e77f2088f6fbf8c367f247cfdd0dc (diff) | |
parent | 32c6f40a6319d493e5270c72ac5d27dc99d1b242 (diff) | |
download | mariadb-git-d97342b6f2cfdd55eb0f82b390ebc89c5997c382.tar.gz |
Merge branch '10.2' into 10.3
Diffstat (limited to 'sql/sql_yacc.yy')
-rw-r--r-- | sql/sql_yacc.yy | 38 |
1 files changed, 20 insertions, 18 deletions
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index e844c500b77..f5aecf37ecc 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -887,7 +887,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); Currently there are 52 shift/reduce conflicts. We should not introduce new conflicts any more. */ -%expect 52 +%expect 51 /* Comments for TOKENS. @@ -1665,10 +1665,6 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); %token <kwd> YEAR_SYM /* SQL-2003-R */ -%left JOIN_SYM INNER_SYM STRAIGHT_JOIN CROSS LEFT RIGHT -/* A dummy token to force the priority of table_ref production in a join. */ -%left TABLE_REF_PRIORITY - /* Give ESCAPE (in LIKE) a very low precedence. This allows the concatenation operator || to be used on the right @@ -1678,6 +1674,9 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); %left PREC_BELOW_ESCAPE %left ESCAPE_SYM +/* A dummy token to force the priority of table_ref production in a join. */ +%left CONDITIONLESS_JOIN +%left JOIN_SYM INNER_SYM STRAIGHT_JOIN CROSS LEFT RIGHT ON_SYM USING %left SET_VAR %left OR_SYM OR2_SYM %left XOR @@ -11863,9 +11862,9 @@ join_table_list: and are ignored. */ esc_table_ref: - table_ref { $$=$1; } - | '{' ident table_ref '}' { $$=$3; } - ; + table_ref { $$=$1; } + | '{' ident table_ref '}' { $$=$3; } + ; /* Equivalent to <table reference list> in the SQL:2003 standard. */ /* Warning - may return NULL in case of incomplete SELECT */ @@ -11878,11 +11877,9 @@ derived_table_list: ; /* - Notice that JOIN is a left-associative operation, and it must be parsed - as such, that is, the parser must process first the left join operand - then the right one. Such order of processing ensures that the parser - produces correct join trees which is essential for semantic analysis - and subsequent optimization phases. + Notice that JOIN can be a left-associative operator in one context and + a right-associative operator in another context (see the comment for + st_select_lex::add_cross_joined_table). */ join_table: /* INNER JOIN variants */ @@ -11891,8 +11888,13 @@ join_table: so that [INNER | CROSS] JOIN is properly nested as other left-associative joins. */ - table_ref normal_join table_ref %prec TABLE_REF_PRIORITY - { MYSQL_YYABORT_UNLESS($1 && ($$=$3)); $3->straight=$2; } + table_ref normal_join table_ref %prec CONDITIONLESS_JOIN + { + MYSQL_YYABORT_UNLESS($1 && ($$=$3)); + + if (unlikely(Select->add_cross_joined_table($1, $3, $2))) + MYSQL_YYABORT; + } | table_ref normal_join table_ref ON { @@ -11906,7 +11908,7 @@ join_table: { $3->straight=$2; add_join_on(thd, $3, $6); - Lex->pop_context(); + $3->on_context= Lex->pop_context(); Select->parsing_place= NO_MATTER; } | table_ref normal_join table_ref @@ -11940,7 +11942,7 @@ join_table: expr { add_join_on(thd, $5, $8); - Lex->pop_context(); + $5->on_context= Lex->pop_context(); $5->outer_join|=JOIN_TYPE_LEFT; $$=$5; Select->parsing_place= NO_MATTER; @@ -11979,7 +11981,7 @@ join_table: if (unlikely(!($$= lex->current_select->convert_right_join()))) MYSQL_YYABORT; add_join_on(thd, $$, $8); - Lex->pop_context(); + $1->on_context= Lex->pop_context(); Select->parsing_place= NO_MATTER; } | table_ref RIGHT opt_outer JOIN_SYM table_factor |