summaryrefslogtreecommitdiff
path: root/sql/sql_yacc.yy
diff options
context:
space:
mode:
authorgkodinov@dl145s.mysql.com <>2006-09-18 12:57:20 +0200
committergkodinov@dl145s.mysql.com <>2006-09-18 12:57:20 +0200
commitce8ed889d70c63332ba1f8317baf9d6a91cf7cbe (patch)
tree5370a5cf6745df5fd6690197a45f08ce5e60daf1 /sql/sql_yacc.yy
parent343e08391d70accf2d2c9f077b3e950b53ea05fe (diff)
parent2ec485f06eb5cdf8a38c6192690ae29045181a72 (diff)
downloadmariadb-git-ce8ed889d70c63332ba1f8317baf9d6a91cf7cbe.tar.gz
Merge dl145s.mysql.com:/data/bk/team_tree_merge/MERGE/mysql-5.0-opt
into dl145s.mysql.com:/data/bk/team_tree_merge/MERGE/mysql-5.1
Diffstat (limited to 'sql/sql_yacc.yy')
-rw-r--r--sql/sql_yacc.yy150
1 files changed, 78 insertions, 72 deletions
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index d4e0c5ed907..4aab923d8c0 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -797,8 +797,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
predicate bit_expr bit_term bit_factor value_expr term factor
table_wild simple_expr udf_expr
expr_or_default set_expr_or_default interval_expr
- param_marker singlerow_subselect singlerow_subselect_init
- exists_subselect exists_subselect_init geometry_function
+ param_marker geometry_function
signed_literal now_or_signed_literal opt_escape
sp_opt_default
simple_ident_nospvar simple_ident_q
@@ -864,7 +863,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
%type <variable> internal_variable_name
-%type <select_lex> in_subselect in_subselect_init
+%type <select_lex> subselect subselect_init
get_select_lex
%type <boolfunc2creator> comp_op
@@ -5564,12 +5563,14 @@ select_paren:
yyerror(ER(ER_SYNTAX_ERROR));
YYABORT;
}
- if (sel->linkage == UNION_TYPE &&
- !sel->master_unit()->first_select()->braces)
- {
- yyerror(ER(ER_SYNTAX_ERROR));
- YYABORT;
- }
+ if (sel->linkage == UNION_TYPE &&
+ !sel->master_unit()->first_select()->braces &&
+ sel->master_unit()->first_select()->linkage ==
+ UNION_TYPE)
+ {
+ yyerror(ER(ER_SYNTAX_ERROR));
+ YYABORT;
+ }
/* select in braces, can't contain global parameters */
if (sel->master_unit()->fake_select_lex)
sel->master_unit()->global_parameters=
@@ -5827,37 +5828,37 @@ bool_pri:
| bool_pri EQUAL_SYM predicate { $$= new Item_func_equal($1,$3); }
| bool_pri comp_op predicate %prec EQ
{ $$= (*$2)(0)->create($1,$3); }
- | bool_pri comp_op all_or_any in_subselect %prec EQ
- { $$= all_any_subquery_creator($1, $2, $3, $4); }
+ | bool_pri comp_op all_or_any '(' subselect ')' %prec EQ
+ { $$= all_any_subquery_creator($1, $2, $3, $5); }
| predicate ;
predicate:
- bit_expr IN_SYM '(' expr_list ')'
+ bit_expr IN_SYM '(' subselect ')'
+ { $$= new Item_in_subselect($1, $4); }
+ | bit_expr not IN_SYM '(' subselect ')'
+ { $$= negate_expression(YYTHD, new Item_in_subselect($1, $5)); }
+ | bit_expr IN_SYM '(' expr ')'
+ {
+ $$= new Item_func_eq($1, $4);
+ }
+ | bit_expr IN_SYM '(' expr ',' expr_list ')'
{
- if ($4->elements == 1)
- $$= new Item_func_eq($1, $4->head());
- else
- {
- $4->push_front($1);
- $$= new Item_func_in(*$4);
- }
+ $6->push_front($4);
+ $6->push_front($1);
+ $$= new Item_func_in(*$6);
}
- | bit_expr not IN_SYM '(' expr_list ')'
+ | bit_expr not IN_SYM '(' expr ')'
{
- if ($5->elements == 1)
- $$= new Item_func_ne($1, $5->head());
- else
- {
- $5->push_front($1);
- Item_func_in *item = new Item_func_in(*$5);
+ $$= new Item_func_ne($1, $5);
+ }
+ | bit_expr not IN_SYM '(' expr ',' expr_list ')'
+ {
+ $7->push_front($5);
+ $7->push_front($1);
+ Item_func_in *item = new Item_func_in(*$7);
item->negate();
$$= item;
- }
}
- | bit_expr IN_SYM in_subselect
- { $$= new Item_in_subselect($1, $3); }
- | bit_expr not IN_SYM in_subselect
- { $$= negate_expression(YYTHD, new Item_in_subselect($1, $4)); }
| bit_expr BETWEEN_SYM bit_expr AND_SYM predicate
{ $$= new Item_func_between($1,$3,$5); }
| bit_expr not BETWEEN_SYM bit_expr AND_SYM predicate
@@ -5979,6 +5980,10 @@ simple_expr:
| '-' simple_expr %prec NEG { $$= new Item_func_neg($2); }
| '~' simple_expr %prec NEG { $$= new Item_func_bit_neg($2); }
| not2 simple_expr %prec NEG { $$= negate_expression(YYTHD, $2); }
+ | '(' subselect ')'
+ {
+ $$= new Item_singlerow_subselect($2);
+ }
| '(' expr ')' { $$= $2; }
| '(' expr ',' expr_list ')'
{
@@ -5990,8 +5995,10 @@ simple_expr:
$5->push_front($3);
$$= new Item_row(*$5);
}
- | EXISTS exists_subselect { $$= $2; }
- | singlerow_subselect { $$= $1; }
+ | EXISTS '(' subselect ')'
+ {
+ $$= new Item_exists_subselect($3);
+ }
| '{' ident expr '}' { $$= $3; }
| MATCH ident_list_arg AGAINST '(' bit_expr fulltext_options ')'
{ $2->push_front($5);
@@ -8022,14 +8029,17 @@ table_wild_one:
ident opt_wild opt_table_alias
{
if (!Select->add_table_to_list(YYTHD, new Table_ident($1), $3,
- TL_OPTION_UPDATING, Lex->lock_option))
+ TL_OPTION_UPDATING |
+ TL_OPTION_ALIAS, Lex->lock_option))
YYABORT;
}
| ident '.' ident opt_wild opt_table_alias
{
if (!Select->add_table_to_list(YYTHD,
new Table_ident(YYTHD, $1, $3, 0),
- $5, TL_OPTION_UPDATING,
+ $5,
+ TL_OPTION_UPDATING |
+ TL_OPTION_ALIAS,
Lex->lock_option))
YYABORT;
}
@@ -9297,6 +9307,7 @@ keyword:
| UNICODE_SYM {}
| UNINSTALL_SYM {}
| XA_SYM {}
+ | UPGRADE_SYM {}
;
/*
@@ -10657,49 +10668,38 @@ union_option:
| ALL { $$=0; }
;
-singlerow_subselect:
- subselect_start singlerow_subselect_init
- subselect_end
- {
- $$= $2;
- };
-
-singlerow_subselect_init:
- select_init2
- {
- $$= new Item_singlerow_subselect(Lex->current_select->
- master_unit()->first_select());
- };
-
-exists_subselect:
- subselect_start exists_subselect_init
- subselect_end
- {
- $$= $2;
- };
-
-exists_subselect_init:
- select_init2
- {
- $$= new Item_exists_subselect(Lex->current_select->master_unit()->
- first_select());
- };
-
-in_subselect:
- subselect_start in_subselect_init
- subselect_end
- {
- $$= $2;
- };
+subselect:
+ SELECT_SYM subselect_start subselect_init subselect_end
+ {
+ $$= $3;
+ }
+ | '(' subselect_start subselect ')'
+ {
+ LEX *lex= Lex;
+ THD *thd= YYTHD;
+ /*
+ note that a local variable can't be used for
+ $3 as it's used in local variable construction
+ and some compilers can't guarnatee the order
+ in which the local variables are initialized.
+ */
+ List_iterator<Item> it($3->item_list);
+ Item *item;
+ /*
+ we must fill the items list for the "derived table".
+ */
+ while ((item= it++))
+ add_item_to_list(thd, item);
+ }
+ union_clause subselect_end { $$= $3; };
-in_subselect_init:
+subselect_init:
select_init2
{
$$= Lex->current_select->master_unit()->first_select();
};
subselect_start:
- '(' SELECT_SYM
{
LEX *lex=Lex;
if (!lex->expr_allows_subselect)
@@ -10707,12 +10707,18 @@ subselect_start:
yyerror(ER(ER_SYNTAX_ERROR));
YYABORT;
}
+ /*
+ we are making a "derived table" for the parenthesis
+ as we need to have a lex level to fit the union
+ after the parenthesis, e.g.
+ (SELECT .. ) UNION ... becomes
+ SELECT * FROM ((SELECT ...) UNION ...)
+ */
if (mysql_new_select(Lex, 1))
YYABORT;
};
subselect_end:
- ')'
{
LEX *lex=Lex;
lex->pop_context();