*** orig/sql/sql_yacc.yy Mon Mar 5 11:21:23 2007 --- mysql50/sql/sql_yacc.yy Sat Aug 11 11:12:22 2007 *************** *** 886,891 **** --- 896,902 ---- %left SET_VAR %left OR_OR_SYM OR_SYM OR2_SYM XOR %left AND_SYM AND_AND_SYM + %left NOT_SYM %left BETWEEN_SYM CASE_SYM WHEN_SYM THEN_SYM ELSE %left EQ EQUAL_SYM GE GT_SYM LE LT NE IS LIKE REGEXP IN_SYM %left '|' *************** *** 895,901 **** %left '*' '/' '%' DIV_SYM MOD_SYM %left '^' %left NEG '~' ! %right NOT_SYM NOT2_SYM %right BINARY COLLATE_SYM %type --- 906,912 ---- %left '*' '/' '%' DIV_SYM MOD_SYM %left '^' %left NEG '~' ! %right NOT2_SYM %right BINARY COLLATE_SYM %type *************** *** 939,946 **** %type literal text_literal insert_ident order_ident simple_ident select_item2 expr opt_expr opt_else sum_expr in_sum_expr ! variable variable_aux bool_term bool_factor bool_test bool_pri ! 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 geometry_function --- 950,957 ---- %type literal text_literal insert_ident order_ident simple_ident select_item2 expr opt_expr opt_else sum_expr in_sum_expr ! variable variable_aux bool_pri bool_test ! predicate table_wild simple_expr udf_expr expr_or_default set_expr_or_default interval_expr param_marker geometry_function *************** *** 948,953 **** --- 959,965 ---- sp_opt_default simple_ident_nospvar simple_ident_q field_or_var limit_option + or_expr no_or_expr %type NUM_literal *************** *** 4342,4438 **** /* all possible expressions */ expr: ! bool_term { Select->expr_list.push_front(new List); } ! bool_or_expr ! { ! List *list= Select->expr_list.pop(); ! if (list->elements) ! { ! list->push_front($1); ! $$= new Item_cond_or(*list); ! /* optimize construction of logical OR to reduce ! amount of objects for complex expressions */ ! } ! else ! $$= $1; ! delete list; ! } ! ; ! ! bool_or_expr: ! /* empty */ ! | bool_or_expr or bool_term ! { Select->expr_list.head()->push_back($3); } ! ; ! ! bool_term: ! bool_term XOR bool_term { $$= new Item_cond_xor($1,$3); } ! | bool_factor { Select->expr_list.push_front(new List); } ! bool_and_expr ! { ! List *list= Select->expr_list.pop(); ! if (list->elements) ! { ! list->push_front($1); ! $$= new Item_cond_and(*list); ! /* optimize construction of logical AND to reduce ! amount of objects for complex expressions */ ! } ! else ! $$= $1; ! delete list; ! } ; ! bool_and_expr: ! /* empty */ ! | bool_and_expr and bool_factor ! { Select->expr_list.head()->push_back($3); } ! ; ! bool_factor: ! NOT_SYM bool_factor { $$= negate_expression(YYTHD, $2); } ! | bool_test ; ! bool_test: ! bool_pri IS TRUE_SYM { $$= is_truth_value($1,1,0); } | bool_pri IS not TRUE_SYM { $$= is_truth_value($1,0,0); } | bool_pri IS FALSE_SYM { $$= is_truth_value($1,0,1); } | bool_pri IS not FALSE_SYM { $$= is_truth_value($1,1,1); } | bool_pri IS UNKNOWN_SYM { $$= new Item_func_isnull($1); } | bool_pri IS not UNKNOWN_SYM { $$= new Item_func_isnotnull($1); } ! | bool_pri ; bool_pri: bool_pri IS NULL_SYM { $$= new Item_func_isnull($1); } | bool_pri IS not NULL_SYM { $$= new Item_func_isnotnull($1); } ! | 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 '(' subselect ')' %prec EQ { $$= all_any_subquery_creator($1, $2, $3, $5); } ! | predicate ; predicate: ! 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 ')' { $6->push_front($4); $6->push_front($1); $$= new Item_func_in(*$6); } ! | bit_expr not IN_SYM '(' expr ')' { $$= new Item_func_ne($1, $5); } ! | bit_expr not IN_SYM '(' expr ',' expr_list ')' { $7->push_front($5); $7->push_front($1); --- 4355,4522 ---- /* all possible expressions */ expr: ! or_expr ! | bool_test ! | simple_expr ! ; ! ! /* OR clauses */ ! or_expr: ! /* 'or_expr' can be a 'bool_test' or 'simple_expr' so rule is ! duplicated */ ! or_expr or no_or_expr ! { $$= new Item_cond_or($1, $3); } ! | bool_test or no_or_expr ! { $$= new Item_cond_or($1, $3); } ! | simple_expr or no_or_expr ! { $$= new Item_cond_or($1, $3); } ! ! /* 'no_or_expr' can be a 'bool_test' or 'simple_expr' so rules are ! duplicated */ ! | or_expr or bool_test ! { $$= new Item_cond_or($1, $3); } ! | or_expr or simple_expr ! { $$= new Item_cond_or($1, $3); } ! | bool_test or bool_test ! { $$= new Item_cond_or($1, $3); } ! | bool_test or simple_expr ! { $$= new Item_cond_or($1, $3); } ! | simple_expr or bool_test ! { $$= new Item_cond_or($1, $3); } ! | simple_expr or simple_expr ! { $$= new Item_cond_or($1, $3); } ! ! | no_or_expr ! ; ! ! /* AND and XOR clauses */ ! no_or_expr: ! /* 'no_or_expr' can be a 'bool_test' or 'simple_expr' so rule is ! duplicated */ ! no_or_expr and bool_test ! { $$= new Item_cond_and($1, $3); } ! | bool_test and bool_test ! { $$= new Item_cond_and($1, $3); } ! | simple_expr and bool_test ! { $$= new Item_cond_and($1, $3); } ! ! /* 'no_or_expr' can be a 'bool_test' or 'simple_expr' so rule is ! duplicated */ ! | no_or_expr and simple_expr ! { $$= new Item_cond_and($1, $3); } ! | bool_test and simple_expr ! { $$= new Item_cond_and($1, $3); } ! | simple_expr and simple_expr ! { $$= new Item_cond_and($1, $3); } ! ! /* 'no_or_expr' can be a 'bool_test' or 'simple_expr' so rule is ! duplicated */ ! | no_or_expr XOR bool_test ! { $$= new Item_cond_xor($1, $3); } ! | bool_test XOR bool_test ! { $$= new Item_cond_xor($1, $3); } ! | simple_expr XOR bool_test ! { $$= new Item_cond_xor($1, $3); } ! ! /* 'no_or_expr' can be a 'bool_test' or 'simple_expr' so rule is ! duplicated */ ! | no_or_expr XOR simple_expr ! { $$= new Item_cond_xor($1, $3); } ! | bool_test XOR simple_expr ! { $$= new Item_cond_xor($1, $3); } ! | simple_expr XOR simple_expr ! { $$= new Item_cond_xor($1, $3); } ; ! bool_test: ! NOT_SYM bool_test { $$= negate_expression(YYTHD, $2); } ! /* 'bool_pri' can be a 'simple_expr', so rule is duplicated */ ! | bool_pri IS TRUE_SYM { $$= is_truth_value($1,1,0); } ! | simple_expr IS TRUE_SYM { $$= is_truth_value($1,1,0); } ! /* 'bool_pri' can be a 'simple_expr', so rule is duplicated */ | bool_pri IS not TRUE_SYM { $$= is_truth_value($1,0,0); } + | simple_expr IS not TRUE_SYM { $$= is_truth_value($1,0,0); } + + /* 'bool_pri' can be a 'simple_expr', so rule is duplicated */ | bool_pri IS FALSE_SYM { $$= is_truth_value($1,0,1); } + | simple_expr IS FALSE_SYM { $$= is_truth_value($1,0,1); } + + /* 'bool_pri' can be a 'simple_expr', so rule is duplicated */ | bool_pri IS not FALSE_SYM { $$= is_truth_value($1,1,1); } + | simple_expr IS not FALSE_SYM { $$= is_truth_value($1,1,1); } + + /* 'bool_pri' can be a 'simple_expr', so rule is duplicated */ | bool_pri IS UNKNOWN_SYM { $$= new Item_func_isnull($1); } + | simple_expr IS UNKNOWN_SYM { $$= new Item_func_isnull($1); } + + /* 'bool_pri' can be a 'simple_expr', so rule is duplicated */ | bool_pri IS not UNKNOWN_SYM { $$= new Item_func_isnotnull($1); } ! | simple_expr IS not UNKNOWN_SYM { $$= new Item_func_isnotnull($1); } ! ! | bool_pri ! ; bool_pri: + /* 'bool_pri' can be a 'simple_expr', so rule is duplicated */ bool_pri IS NULL_SYM { $$= new Item_func_isnull($1); } + | simple_expr IS NULL_SYM { $$= new Item_func_isnull($1); } + + /* 'bool_pri' can be a 'simple_expr', so rule is duplicated */ | bool_pri IS not NULL_SYM { $$= new Item_func_isnotnull($1); } ! | simple_expr IS not NULL_SYM { $$= new Item_func_isnotnull($1); } ! ! /* 'bool_pri' can be a 'simple_expr', so rule is duplicated */ | bool_pri comp_op all_or_any '(' subselect ')' %prec EQ { $$= all_any_subquery_creator($1, $2, $3, $5); } ! | simple_expr comp_op all_or_any '(' subselect ')' %prec EQ ! { $$= all_any_subquery_creator($1, $2, $3, $5); } ! ! /* 'bool_pri' and 'predicate' can be a 'simple_expr', so rule is ! duplicated */ ! | bool_pri EQUAL_SYM predicate ! { $$= new Item_func_equal($1,$3); } ! | bool_pri EQUAL_SYM simple_expr ! { $$= new Item_func_equal($1,$3); } ! | simple_expr EQUAL_SYM predicate ! { $$= new Item_func_equal($1,$3); } ! | simple_expr EQUAL_SYM simple_expr ! { $$= new Item_func_equal($1,$3); } ! ! /* 'bool_pri' and 'predicate' can be a 'simple_expr', so rule is ! duplicated */ ! | bool_pri comp_op predicate %prec EQ ! { $$= (*$2)(0)->create($1,$3); } ! | bool_pri comp_op simple_expr %prec EQ ! { $$= (*$2)(0)->create($1,$3); } ! | simple_expr comp_op predicate %prec EQ ! { $$= (*$2)(0)->create($1,$3); } ! | simple_expr comp_op simple_expr %prec EQ ! { $$= (*$2)(0)->create($1,$3); } ! | predicate ! ; predicate: ! simple_expr IN_SYM '(' subselect ')' { $$= new Item_in_subselect($1, $4); } ! | simple_expr not IN_SYM '(' subselect ')' { $$= negate_expression(YYTHD, new Item_in_subselect($1, $5)); } ! | simple_expr IN_SYM '(' expr ')' { $$= new Item_func_eq($1, $4); } ! | simple_expr IN_SYM '(' expr ',' expr_list ')' { $6->push_front($4); $6->push_front($1); $$= new Item_func_in(*$6); } ! | simple_expr not IN_SYM '(' expr ')' { $$= new Item_func_ne($1, $5); } ! | simple_expr not IN_SYM '(' expr ',' expr_list ')' { $7->push_front($5); $7->push_front($1); *************** *** 4440,4500 **** item->negate(); $$= item; } ! | 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 ! { ! Item_func_between *item= new Item_func_between($1,$4,$6); ! item->negate(); ! $$= item; ! } ! | bit_expr SOUNDS_SYM LIKE bit_expr ! { $$= new Item_func_eq(new Item_func_soundex($1), ! new Item_func_soundex($4)); } ! | bit_expr LIKE simple_expr opt_escape { $$= new Item_func_like($1,$3,$4,Lex->escape_used); } ! | bit_expr not LIKE simple_expr opt_escape { $$= new Item_func_not(new Item_func_like($1,$4,$5, Lex->escape_used)); } ! | bit_expr REGEXP bit_expr { $$= new Item_func_regex($1,$3); } ! | bit_expr not REGEXP bit_expr { $$= negate_expression(YYTHD, new Item_func_regex($1,$4)); } - | bit_expr ; - - bit_expr: - bit_expr '|' bit_term { $$= new Item_func_bit_or($1,$3); } - | bit_term ; - - bit_term: - bit_term '&' bit_factor { $$= new Item_func_bit_and($1,$3); } - | bit_factor ; ! bit_factor: ! bit_factor SHIFT_LEFT value_expr ! { $$= new Item_func_shift_left($1,$3); } ! | bit_factor SHIFT_RIGHT value_expr ! { $$= new Item_func_shift_right($1,$3); } ! | value_expr ; ! ! value_expr: ! value_expr '+' term { $$= new Item_func_plus($1,$3); } ! | value_expr '-' term { $$= new Item_func_minus($1,$3); } ! | value_expr '+' interval_expr interval ! { $$= new Item_date_add_interval($1,$3,$4,0); } ! | value_expr '-' interval_expr interval ! { $$= new Item_date_add_interval($1,$3,$4,1); } ! | term ; ! term: ! term '*' factor { $$= new Item_func_mul($1,$3); } ! | term '/' factor { $$= new Item_func_div($1,$3); } ! | term '%' factor { $$= new Item_func_mod($1,$3); } ! | term DIV_SYM factor { $$= new Item_func_int_div($1,$3); } ! | term MOD_SYM factor { $$= new Item_func_mod($1,$3); } ! | factor ; ! ! factor: ! factor '^' simple_expr { $$= new Item_func_bit_xor($1,$3); } ! | simple_expr ; or: OR_SYM | OR2_SYM; and: AND_SYM | AND_AND_SYM; --- 4524,4560 ---- item->negate(); $$= item; } ! | simple_expr LIKE simple_expr opt_escape { $$= new Item_func_like($1,$3,$4,Lex->escape_used); } ! | simple_expr not LIKE simple_expr opt_escape { $$= new Item_func_not(new Item_func_like($1,$4,$5, Lex->escape_used)); } ! | simple_expr SOUNDS_SYM LIKE simple_expr ! { $$= new Item_func_eq(new Item_func_soundex($1), ! new Item_func_soundex($4)); } ! | simple_expr REGEXP simple_expr { $$= new Item_func_regex($1,$3); } ! | simple_expr not REGEXP simple_expr { $$= negate_expression(YYTHD, new Item_func_regex($1,$4)); } ! /* 'predicate' can be a 'simple_expr', so rule is duplicated */ ! | simple_expr BETWEEN_SYM simple_expr AND_SYM predicate ! { $$= new Item_func_between($1,$3,$5); } ! | simple_expr BETWEEN_SYM simple_expr AND_SYM simple_expr ! { $$= new Item_func_between($1,$3,$5); } ! /* 'predicate' can be a 'simple_expr', so rule is duplicated */ ! | simple_expr not BETWEEN_SYM simple_expr AND_SYM predicate ! { ! Item_func_between *item= new Item_func_between($1,$4,$6); ! item->negate(); ! $$= item; ! } ! | simple_expr not BETWEEN_SYM simple_expr AND_SYM simple_expr ! { ! Item_func_between *item= new Item_func_between($1,$4,$6); ! item->negate(); ! $$= item; ! } ! ; or: OR_SYM | OR2_SYM; and: AND_SYM | AND_AND_SYM; *************** *** 4556,4562 **** $$= new Item_exists_subselect($3); } | '{' ident expr '}' { $$= $3; } ! | MATCH ident_list_arg AGAINST '(' bit_expr fulltext_options ')' { $2->push_front($5); Select->add_ftfunc_to_list((Item_func_match*) ($$=new Item_func_match(*$2,$6))); } --- 4616,4622 ---- $$= new Item_exists_subselect($3); } | '{' ident expr '}' { $$= $3; } ! | MATCH ident_list_arg AGAINST '(' simple_expr fulltext_options ')' { $2->push_front($5); Select->add_ftfunc_to_list((Item_func_match*) ($$=new Item_func_match(*$2,$6))); } *************** *** 4824,4830 **** } | OLD_PASSWORD '(' expr ')' { $$= new Item_func_old_password($3); } ! | POSITION_SYM '(' bit_expr IN_SYM expr ')' { $$ = new Item_func_locate($5,$3); } | QUARTER_SYM '(' expr ')' { $$ = new Item_func_quarter($3); } --- 4884,4890 ---- } | OLD_PASSWORD '(' expr ')' { $$= new Item_func_old_password($3); } ! | POSITION_SYM '(' simple_expr IN_SYM expr ')' { $$ = new Item_func_locate($5,$3); } | QUARTER_SYM '(' expr ')' { $$ = new Item_func_quarter($3); } *************** *** 5071,5077 **** Lex->uncacheable(UNCACHEABLE_SIDEEFFECT); } | EXTRACT_SYM '(' interval FROM expr ')' ! { $$=new Item_extract( $3, $5); }; geometry_function: CONTAINS_SYM '(' expr ',' expr ')' --- 5131,5169 ---- Lex->uncacheable(UNCACHEABLE_SIDEEFFECT); } | EXTRACT_SYM '(' interval FROM expr ')' ! { $$=new Item_extract( $3, $5); } ! ! | NOT_SYM simple_expr ! { $$= negate_expression(YYTHD, $2); } ! | simple_expr '|' simple_expr ! { $$= new Item_func_bit_or($1,$3); } ! | simple_expr '&' simple_expr ! { $$= new Item_func_bit_and($1,$3); } ! | simple_expr SHIFT_LEFT simple_expr ! { $$= new Item_func_shift_left($1,$3); } ! | simple_expr SHIFT_RIGHT simple_expr ! { $$= new Item_func_shift_right($1,$3); } ! | simple_expr '+' simple_expr ! { $$= new Item_func_plus($1,$3); } ! | simple_expr '-' simple_expr ! { $$= new Item_func_minus($1,$3); } ! | simple_expr '+' interval_expr interval ! { $$= new Item_date_add_interval($1,$3,$4,0); } ! | simple_expr '-' interval_expr interval ! { $$= new Item_date_add_interval($1,$3,$4,1); } ! | simple_expr '*' simple_expr ! { $$= new Item_func_mul($1,$3); } ! | simple_expr '/' simple_expr ! { $$= new Item_func_div($1,$3); } ! | simple_expr '%' simple_expr ! { $$= new Item_func_mod($1,$3); } ! | simple_expr DIV_SYM simple_expr ! { $$= new Item_func_int_div($1,$3); } ! | simple_expr MOD_SYM simple_expr ! { $$= new Item_func_mod($1,$3); } ! | simple_expr '^' simple_expr ! { $$= new Item_func_bit_xor($1,$3); } ! ; geometry_function: CONTAINS_SYM '(' expr ',' expr ')'