@@ -1183,8 +1183,8 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
11831183%token <kwd> ST_COLLECT_SYM
11841184/* A dummy token to force the priority of table_ref production in a join. */
11851185%left CONDITIONLESS_JOIN
1186- %left JOIN_SYM INNER_SYM STRAIGHT_JOIN CROSS LEFT RIGHT ON_SYM USING
1187-
1186+ %left JOIN_SYM INNER_SYM STRAIGHT_JOIN CROSS LEFT RIGHT ON_SYM USING FULL
1187+
11881188%left SET_VAR
11891189%left OR_SYM OR2_SYM
11901190%left XOR
@@ -12365,8 +12365,72 @@ join_table:
1236512365 if (unlikely(!($$= lex->current_select->convert_right_join())))
1236612366 MYSQL_YYABORT;
1236712367 }
12368- ;
1236912368
12369+ /* FULL OUTER JOIN variants */
12370+ | table_ref FULL opt_outer JOIN_SYM table_ref
12371+ ON
12372+ {
12373+ MYSQL_YYABORT_UNLESS($1 && $5);
12374+
12375+ Select->add_joined_table($1);
12376+ $1->outer_join|= (JOIN_TYPE_LEFT |
12377+ JOIN_TYPE_FULL |
12378+ JOIN_TYPE_OUTER);
12379+
12380+ Select->add_joined_table($5);
12381+ $5->outer_join|= (JOIN_TYPE_RIGHT |
12382+ JOIN_TYPE_FULL |
12383+ JOIN_TYPE_OUTER);
12384+
12385+ /* Change the current name resolution context to a local context. */
12386+ if (unlikely(push_new_name_resolution_context(thd, $1, $5)))
12387+ MYSQL_YYABORT;
12388+ Select->parsing_place= IN_ON;
12389+ }
12390+ expr
12391+ {
12392+ add_join_on(thd, $1, $8);
12393+ $1->on_context= Lex->pop_context();
12394+ Select->parsing_place= NO_MATTER;
12395+ $$= $1;
12396+ Lex->has_full_outer_join= true;
12397+ }
12398+ | table_ref FULL opt_outer JOIN_SYM table_factor
12399+ {
12400+ MYSQL_YYABORT_UNLESS($1 && $5);
12401+ Select->add_joined_table($1);
12402+ $1->outer_join|= (JOIN_TYPE_LEFT |
12403+ JOIN_TYPE_FULL |
12404+ JOIN_TYPE_OUTER);
12405+
12406+ Select->add_joined_table($5);
12407+ $5->outer_join|= (JOIN_TYPE_RIGHT |
12408+ JOIN_TYPE_FULL |
12409+ JOIN_TYPE_OUTER);
12410+ }
12411+ USING '(' using_list ')'
12412+ {
12413+ add_join_natural($1,$5,$9,Select);
12414+ Lex->has_full_outer_join= true;
12415+ }
12416+ | table_ref NATURAL FULL opt_outer JOIN_SYM table_factor
12417+ {
12418+ MYSQL_YYABORT_UNLESS($1 && $6);
12419+
12420+ Select->add_joined_table($1);
12421+ $1->outer_join|= (JOIN_TYPE_LEFT |
12422+ JOIN_TYPE_FULL |
12423+ JOIN_TYPE_OUTER);
12424+
12425+ Select->add_joined_table($6);
12426+ $6->outer_join|= (JOIN_TYPE_RIGHT |
12427+ JOIN_TYPE_FULL |
12428+ JOIN_TYPE_OUTER);
12429+
12430+ add_join_natural($6,$1,NULL,Select);
12431+ Lex->has_full_outer_join= true;
12432+ }
12433+ ;
1237012434
1237112435inner_join: /* $$ set if using STRAIGHT_JOIN, false otherwise */
1237212436 JOIN_SYM { $$ = 0; }
@@ -16691,7 +16755,6 @@ keyword_func_sp_var_and_label:
1669116755 | FILE_SYM
1669216756 | FIRST_SYM
1669316757 | FOUND_SYM
16694- | FULL
1669516758 | GENERAL
1669616759 | GENERATED_SYM
1669716760 | GRANTS
@@ -17021,6 +17084,7 @@ reserved_keyword_udt_not_param_type:
1702117084 | FIRST_VALUE_SYM
1702217085 | FOREIGN
1702317086 | FROM
17087+ | FULL
1702417088 | FULLTEXT_SYM
1702517089 | GOTO_ORACLE_SYM
1702617090 | GRANT
@@ -17748,6 +17812,7 @@ set_expr_or_default:
1774817812set_expr_misc:
1774917813 ON { $$= new (thd->mem_root) Item_string_sys(thd, "ON", 2); }
1775017814 | ALL { $$= new (thd->mem_root) Item_string_sys(thd, "ALL", 3); }
17815+ | FULL { $$= new (thd->mem_root) Item_string_sys(thd, "FULL", 4); }
1775117816 | BINARY { $$= new (thd->mem_root) Item_string_sys(thd, "binary", 6); }
1775217817 ;
1775317818
0 commit comments