%nonassoc LIKE
%nonassoc BETWEEN
%nonassoc IN
-%nonassoc Op /* multi-character ops and user-defined operators */
+%left Op /* multi-character ops and user-defined operators */
%nonassoc NOTNULL
%nonassoc ISNULL
%nonassoc IS
%left '+' '-'
-%left '*' '/'
+%left '*' '/' '%'
%left '|' /* this is the relation union op, not logical or */
/* Unary Operators */
%right ':'
{ $$ = cat3_str($1, make1_str("-"), $3); }
| default_expr '/' default_expr
{ $$ = cat3_str($1, make1_str("/"), $3); }
+ | default_expr '%' default_expr
+ { $$ = cat3_str($1, make1_str("%"), $3); }
| default_expr '*' default_expr
{ $$ = cat3_str($1, make1_str("*"), $3); }
| default_expr '=' default_expr
{ $$ = cat3_str($1, make1_str("-"), $3); }
| constraint_expr '/' constraint_expr
{ $$ = cat3_str($1, make1_str("/"), $3); }
+ | constraint_expr '%' constraint_expr
+ { $$ = cat3_str($1, make1_str("%"), $3); }
| constraint_expr '*' constraint_expr
{ $$ = cat3_str($1, make1_str("*"), $3); }
| constraint_expr '=' constraint_expr
MathOp: '+' { $$ = make1_str("+"); }
| '-' { $$ = make1_str("-"); }
| '*' { $$ = make1_str("*"); }
+ | '%' { $$ = make1_str("%"); }
| '/' { $$ = make1_str("/"); }
| '<' { $$ = make1_str("<"); }
| '>' { $$ = make1_str(">"); }
| '+' { $$ = "+"; }
| '-' { $$ = "-"; }
| '*' { $$ = "*"; }
+ | '%' { $$ = "%"; }
| '/' { $$ = "/"; }
;
{ $$ = cat3_str($1, make1_str("-"), $3); }
| a_expr '/' a_expr
{ $$ = cat3_str($1, make1_str("/"), $3); }
+ | a_expr '%' a_expr
+ { $$ = cat3_str($1, make1_str("%"), $3); }
| a_expr '*' a_expr
{ $$ = cat3_str($1, make1_str("*"), $3); }
| a_expr '<' a_expr
{
$$ = make4_str($1, make1_str("/("), $4, make1_str(")"));
}
+ | a_expr '%' '(' SubSelect ')'
+ {
+ $$ = make4_str($1, make1_str("%("), $4, make1_str(")"));
+ }
| a_expr '*' '(' SubSelect ')'
{
$$ = make4_str($1, make1_str("*("), $4, make1_str(")"));
}
| a_expr '+' ANY '(' SubSelect ')'
{
- $$ = make4_str($1, make1_str("+any("), $5, make1_str(")"));
+ $$ = make4_str($1, make1_str("+ any("), $5, make1_str(")"));
}
| a_expr '-' ANY '(' SubSelect ')'
{
- $$ = make4_str($1, make1_str("-any("), $5, make1_str(")"));
+ $$ = make4_str($1, make1_str("- any("), $5, make1_str(")"));
}
| a_expr '/' ANY '(' SubSelect ')'
{
- $$ = make4_str($1, make1_str("/any("), $5, make1_str(")"));
+ $$ = make4_str($1, make1_str("/ any("), $5, make1_str(")"));
+ }
+ | a_expr '%' ANY '(' SubSelect ')'
+ {
+ $$ = make4_str($1, make1_str("% any("), $5, make1_str(")"));
}
| a_expr '*' ANY '(' SubSelect ')'
{
- $$ = make4_str($1, make1_str("*any("), $5, make1_str(")"));
+ $$ = make4_str($1, make1_str("* any("), $5, make1_str(")"));
}
| a_expr '<' ANY '(' SubSelect ')'
{
- $$ = make4_str($1, make1_str("<any("), $5, make1_str(")"));
+ $$ = make4_str($1, make1_str("< any("), $5, make1_str(")"));
}
| a_expr '>' ANY '(' SubSelect ')'
{
- $$ = make4_str($1, make1_str(">any("), $5, make1_str(")"));
+ $$ = make4_str($1, make1_str("> any("), $5, make1_str(")"));
}
| a_expr '=' ANY '(' SubSelect ')'
{
- $$ = make4_str($1, make1_str("=any("), $5, make1_str(")"));
+ $$ = make4_str($1, make1_str("= any("), $5, make1_str(")"));
}
| a_expr Op ALL '(' SubSelect ')'
{
}
| a_expr '+' ALL '(' SubSelect ')'
{
- $$ = make4_str($1, make1_str("+all("), $5, make1_str(")"));
+ $$ = make4_str($1, make1_str("+ all("), $5, make1_str(")"));
}
| a_expr '-' ALL '(' SubSelect ')'
{
- $$ = make4_str($1, make1_str("-all("), $5, make1_str(")"));
+ $$ = make4_str($1, make1_str("- all("), $5, make1_str(")"));
}
| a_expr '/' ALL '(' SubSelect ')'
{
- $$ = make4_str($1, make1_str("/all("), $5, make1_str(")"));
+ $$ = make4_str($1, make1_str("/ all("), $5, make1_str(")"));
+ }
+ | a_expr '%' ALL '(' SubSelect ')'
+ {
+ $$ = make4_str($1, make1_str("% all("), $5, make1_str(")"));
}
| a_expr '*' ALL '(' SubSelect ')'
{
- $$ = make4_str($1, make1_str("*all("), $5, make1_str(")"));
+ $$ = make4_str($1, make1_str("* all("), $5, make1_str(")"));
}
| a_expr '<' ALL '(' SubSelect ')'
{
- $$ = make4_str($1, make1_str("<all("), $5, make1_str(")"));
+ $$ = make4_str($1, make1_str("< all("), $5, make1_str(")"));
}
| a_expr '>' ALL '(' SubSelect ')'
{
- $$ = make4_str($1, make1_str(">all("), $5, make1_str(")"));
+ $$ = make4_str($1, make1_str("> all("), $5, make1_str(")"));
}
| a_expr '=' ALL '(' SubSelect ')'
{
- $$ = make4_str($1, make1_str("=all("), $5, make1_str(")"));
+ $$ = make4_str($1, make1_str("= all("), $5, make1_str(")"));
}
| a_expr AND a_expr
{ $$ = cat3_str($1, make1_str("and"), $3); }
{ $$ = cat3_str($1, make1_str("-"), $3); }
| b_expr '/' b_expr
{ $$ = cat3_str($1, make1_str("/"), $3); }
+ | b_expr '%' b_expr
+ { $$ = cat3_str($1, make1_str("%"), $3); }
| b_expr '*' b_expr
{ $$ = cat3_str($1, make1_str("*"), $3); }
/* not possible in embedded sql | ':' b_expr
{ $$ = cat3_str($1, make1_str("-"), $3); }
| position_expr '/' position_expr
{ $$ = cat3_str($1, make1_str("/"), $3); }
+ | position_expr '%' position_expr
+ { $$ = cat3_str($1, make1_str("%"), $3); }
| position_expr '*' position_expr
{ $$ = cat3_str($1, make1_str("*"), $3); }
| '|' position_expr
{ $$ = cat3_str($1, make1_str("-"), $3); }
| a_expr '/' ecpg_expr
{ $$ = cat3_str($1, make1_str("/"), $3); }
+ | a_expr '%' ecpg_expr
+ { $$ = cat3_str($1, make1_str("%"), $3); }
| a_expr '*' ecpg_expr
{ $$ = cat3_str($1, make1_str("*"), $3); }
| a_expr '<' ecpg_expr
{
$$ = make4_str($1, make1_str("/("), $4, make1_str(")"));
}
+ | a_expr '%' '(' SubSelect ')'
+ {
+ $$ = make4_str($1, make1_str("%("), $4, make1_str(")"));
+ }
| a_expr '*' '(' SubSelect ')'
{
$$ = make4_str($1, make1_str("*("), $4, make1_str(")"));
}
| a_expr '+' ANY '(' SubSelect ')'
{
- $$ = make4_str($1, make1_str("+any("), $5, make1_str(")"));
+ $$ = make4_str($1, make1_str("+ any("), $5, make1_str(")"));
}
| a_expr '-' ANY '(' SubSelect ')'
{
- $$ = make4_str($1, make1_str("-any("), $5, make1_str(")"));
+ $$ = make4_str($1, make1_str("- any("), $5, make1_str(")"));
}
| a_expr '/' ANY '(' SubSelect ')'
{
- $$ = make4_str($1, make1_str("/any("), $5, make1_str(")"));
+ $$ = make4_str($1, make1_str("/ any("), $5, make1_str(")"));
+ }
+ | a_expr '%' ANY '(' SubSelect ')'
+ {
+ $$ = make4_str($1, make1_str("% any("), $5, make1_str(")"));
}
| a_expr '*' ANY '(' SubSelect ')'
{
- $$ = make4_str($1, make1_str("*any("), $5, make1_str(")"));
+ $$ = make4_str($1, make1_str("* any("), $5, make1_str(")"));
}
| a_expr '<' ANY '(' SubSelect ')'
{
- $$ = make4_str($1, make1_str("<any("), $5, make1_str(")"));
+ $$ = make4_str($1, make1_str("< any("), $5, make1_str(")"));
}
| a_expr '>' ANY '(' SubSelect ')'
{
- $$ = make4_str($1, make1_str(">any("), $5, make1_str(")"));
+ $$ = make4_str($1, make1_str("> any("), $5, make1_str(")"));
}
| a_expr '=' ANY '(' SubSelect ')'
{
- $$ = make4_str($1, make1_str("=any("), $5, make1_str(")"));
+ $$ = make4_str($1, make1_str("= any("), $5, make1_str(")"));
}
| a_expr Op ALL '(' SubSelect ')'
{
}
| a_expr '+' ALL '(' SubSelect ')'
{
- $$ = make4_str($1, make1_str("+all("), $5, make1_str(")"));
+ $$ = make4_str($1, make1_str("+ all("), $5, make1_str(")"));
}
| a_expr '-' ALL '(' SubSelect ')'
{
- $$ = make4_str($1, make1_str("-all("), $5, make1_str(")"));
+ $$ = make4_str($1, make1_str("- all("), $5, make1_str(")"));
}
| a_expr '/' ALL '(' SubSelect ')'
{
- $$ = make4_str($1, make1_str("/all("), $5, make1_str(")"));
+ $$ = make4_str($1, make1_str("/ all("), $5, make1_str(")"));
+ }
+ | a_expr '%' ALL '(' SubSelect ')'
+ {
+ $$ = make4_str($1, make1_str("% all("), $5, make1_str(")"));
}
| a_expr '*' ALL '(' SubSelect ')'
{
- $$ = make4_str($1, make1_str("*all("), $5, make1_str(")"));
+ $$ = make4_str($1, make1_str("* all("), $5, make1_str(")"));
}
| a_expr '<' ALL '(' SubSelect ')'
{
- $$ = make4_str($1, make1_str("<all("), $5, make1_str(")"));
+ $$ = make4_str($1, make1_str("< all("), $5, make1_str(")"));
}
| a_expr '>' ALL '(' SubSelect ')'
{
- $$ = make4_str($1, make1_str(">all("), $5, make1_str(")"));
+ $$ = make4_str($1, make1_str("> all("), $5, make1_str(")"));
}
| a_expr '=' ALL '(' SubSelect ')'
{