@@ -263,16 +263,16 @@ make_name(void)
263263%nonassoc OVERLAPS
264264%nonassoc BETWEEN
265265%nonassoc IN
266+ %left POSTFIXOP /* dummy for postfix Op rules */
266267%left Op /* multi-character ops and user-defined operators */
267268%nonassoc NOTNULL
268269%nonassoc ISNULL
269- %nonassoc NULL_P
270- %nonassoc IS
270+ %nonassoc IS NULL_P TRUE_P FALSE_P
271271%left ' +' ' -'
272272%left ' *' ' /' ' %'
273273%left ' ^'
274274/* Unary Operators */
275- %left AT
275+ %left AT ZONE
276276%right UMINUS
277277%left ' .'
278278%left ' [' ' ]'
@@ -3300,7 +3300,7 @@ a_expr: c_expr
33003300 { $$ = cat_str(3 , $1 , $2 , $3 ); }
33013301 | Op a_expr
33023302 { $$ = cat2_str($1 , $2 ); }
3303- | a_expr Op
3303+ | a_expr Op % prec POSTFIXOP
33043304 { $$ = cat2_str($1 , $2 ); }
33053305 | a_expr AND a_expr
33063306 { $$ = cat_str(3 , $1 , make_str(" and" ), $3 ); }
@@ -3345,11 +3345,11 @@ a_expr: c_expr
33453345 { $$ = cat2_str($1 , make_str(" is false" )); }
33463346 | a_expr IS NOT TRUE_P
33473347 { $$ = cat2_str($1 , make_str(" is not true" )); }
3348- | a_expr BETWEEN b_expr AND b_expr
3348+ | a_expr BETWEEN b_expr AND b_expr % prec BETWEEN
33493349 {
33503350 $$ = cat_str(5 , $1 , make_str(" between" ), $3 , make_str(" and" ), $5 );
33513351 }
3352- | a_expr NOT BETWEEN b_expr AND b_expr
3352+ | a_expr NOT BETWEEN b_expr AND b_expr % prec BETWEEN
33533353 {
33543354 $$ = cat_str(5 , $1 , make_str(" not between" ), $4 , make_str(" and" ), $6 );
33553355 }
@@ -3361,7 +3361,7 @@ a_expr: c_expr
33613361 {
33623362 $$ = cat_str(3 , $1 , make_str(" not in " ), $4 );
33633363 }
3364- | a_expr all_Op sub_type select_with_parens
3364+ | a_expr all_Op sub_type select_with_parens % prec Op
33653365 {
33663366 $$ = cat_str(4 , $1 , $2 , $3 , $4 );
33673367 }
@@ -3417,7 +3417,7 @@ b_expr: c_expr
34173417 { $$ = cat_str(3 , $1 , $2 , $3 ); }
34183418 | Op b_expr
34193419 { $$ = cat2_str($1 , $2 ); }
3420- | b_expr Op
3420+ | b_expr Op % prec POSTFIXOP
34213421 { $$ = cat2_str($1 , $2 ); }
34223422 ;
34233423
0 commit comments