@@ -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,66 @@ 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+
12379+ Select->add_joined_table($5);
12380+ $5->outer_join|= (JOIN_TYPE_RIGHT |
12381+ JOIN_TYPE_FULL);
12382+
12383+ /* Change the current name resolution context to a local context. */
12384+ if (unlikely(push_new_name_resolution_context(thd, $1, $5)))
12385+ MYSQL_YYABORT;
12386+ Select->parsing_place= IN_ON;
12387+ }
12388+ expr
12389+ {
12390+ add_join_on(thd, $1, $8);
12391+ $1->on_context= Lex->pop_context();
12392+ Select->parsing_place= NO_MATTER;
12393+ $$= $1;
12394+ Lex->has_full_outer_join= true;
12395+ }
12396+ | table_ref FULL opt_outer JOIN_SYM table_factor
12397+ {
12398+ MYSQL_YYABORT_UNLESS($1 && $5);
12399+ Select->add_joined_table($1);
12400+ $1->outer_join|= (JOIN_TYPE_LEFT |
12401+ JOIN_TYPE_FULL);
12402+
12403+ Select->add_joined_table($5);
12404+ $5->outer_join|= (JOIN_TYPE_RIGHT |
12405+ JOIN_TYPE_FULL);
12406+ }
12407+ USING '(' using_list ')'
12408+ {
12409+ add_join_natural($1,$5,$9,Select);
12410+ Lex->has_full_outer_join= true;
12411+ }
12412+ | table_ref NATURAL FULL opt_outer JOIN_SYM table_factor
12413+ {
12414+ MYSQL_YYABORT_UNLESS($1 && $6);
12415+
12416+ Select->add_joined_table($1);
12417+ $1->outer_join|= (JOIN_TYPE_LEFT |
12418+ JOIN_TYPE_FULL);
12419+
12420+ Select->add_joined_table($6);
12421+ $6->outer_join|= (JOIN_TYPE_RIGHT |
12422+ JOIN_TYPE_FULL);
12423+
12424+ add_join_natural($6,$1,NULL,Select);
12425+ Lex->has_full_outer_join= true;
12426+ }
12427+ ;
1237012428
1237112429inner_join: /* $$ set if using STRAIGHT_JOIN, false otherwise */
1237212430 JOIN_SYM { $$ = 0; }
@@ -16691,7 +16749,6 @@ keyword_func_sp_var_and_label:
1669116749 | FILE_SYM
1669216750 | FIRST_SYM
1669316751 | FOUND_SYM
16694- | FULL
1669516752 | GENERAL
1669616753 | GENERATED_SYM
1669716754 | GRANTS
@@ -17021,6 +17078,7 @@ reserved_keyword_udt_not_param_type:
1702117078 | FIRST_VALUE_SYM
1702217079 | FOREIGN
1702317080 | FROM
17081+ | FULL
1702417082 | FULLTEXT_SYM
1702517083 | GOTO_ORACLE_SYM
1702617084 | GRANT
@@ -17748,6 +17806,7 @@ set_expr_or_default:
1774817806set_expr_misc:
1774917807 ON { $$= new (thd->mem_root) Item_string_sys(thd, "ON", 2); }
1775017808 | ALL { $$= new (thd->mem_root) Item_string_sys(thd, "ALL", 3); }
17809+ | FULL { $$= new (thd->mem_root) Item_string_sys(thd, "FULL", 4); }
1775117810 | BINARY { $$= new (thd->mem_root) Item_string_sys(thd, "binary", 6); }
1775217811 ;
1775317812
0 commit comments