11
11
*
12
12
*
13
13
* IDENTIFICATION
14
- * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.365 2002/09/02 02:13:01 tgl Exp $
14
+ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.366 2002/09/05 22:52:48 tgl Exp $
15
15
*
16
16
* HISTORY
17
17
* AUTHOR DATE MAJOR EVENT
@@ -416,7 +416,6 @@ static void doNegateFloat(Value *v);
416
416
/* precedence: lowest to highest */
417
417
%left UNION EXCEPT
418
418
%left INTERSECT
419
- %left JOIN UNIONJOIN CROSS LEFT FULL RIGHT INNER_P NATURAL
420
419
%left OR
421
420
%left AND
422
421
%right NOT
@@ -425,7 +424,7 @@ static void doNegateFloat(Value *v);
425
424
%nonassoc LIKE ILIKE SIMILAR
426
425
%nonassoc ESCAPE
427
426
%nonassoc OVERLAPS
428
- %nonassoc BETWEEN DISTINCT
427
+ %nonassoc BETWEEN
429
428
%nonassoc IN_P
430
429
%left POSTFIXOP /* dummy for postfix Op rules */
431
430
%left Op OPERATOR /* multi-character ops and user-defined operators */
@@ -443,6 +442,14 @@ static void doNegateFloat(Value *v);
443
442
%left COLLATE
444
443
%left TYPECAST
445
444
%left ' .'
445
+ /*
446
+ * These might seem to be low-precedence, but actually they are not part
447
+ * of the arithmetic hierarchy at all in their use as JOIN operators.
448
+ * We make them high-precedence to support their use as function names.
449
+ * They wouldn't be given a precedence at all, were it not that we need
450
+ * left-associativity among the JOIN rules themselves.
451
+ */
452
+ %left JOIN UNIONJOIN CROSS LEFT FULL RIGHT INNER_P NATURAL
446
453
%%
447
454
448
455
/*
@@ -5419,6 +5426,7 @@ r_expr: row IN_P select_with_parens
5419
5426
$$ = (Node *)makeOverlaps($1 , $3 );
5420
5427
}
5421
5428
| row IS DISTINCT FROM row
5429
+ %prec IS
5422
5430
{
5423
5431
/* IS DISTINCT FROM has the following rules for non-array types:
5424
5432
* a) the row lengths must be equal
@@ -5736,13 +5744,13 @@ a_expr: c_expr { $$ = $1; }
5736
5744
b->booltesttype = IS_NOT_UNKNOWN;
5737
5745
$$ = (Node *)b;
5738
5746
}
5739
- | a_expr IS DISTINCT FROM a_expr %prec DISTINCT
5747
+ | a_expr IS DISTINCT FROM a_expr %prec IS
5740
5748
{ $$ = (Node *) makeSimpleA_Expr(DISTINCT, " =" , $1 , $5 ); }
5741
- | a_expr IS OF ' (' type_list ' )'
5749
+ | a_expr IS OF ' (' type_list ' )' %prec IS
5742
5750
{
5743
5751
$$ = (Node *) makeSimpleA_Expr(OF, " =" , $1 , (Node *) $5 );
5744
5752
}
5745
- | a_expr IS NOT OF ' (' type_list ' )'
5753
+ | a_expr IS NOT OF ' (' type_list ' )' %prec IS
5746
5754
{
5747
5755
$$ = (Node *) makeSimpleA_Expr(OF, " !=" , $1 , (Node *) $6 );
5748
5756
}
@@ -5890,13 +5898,13 @@ b_expr: c_expr
5890
5898
{ $$ = (Node *) makeA_Expr(OP, $1 , NULL , $2 ); }
5891
5899
| b_expr qual_Op %prec POSTFIXOP
5892
5900
{ $$ = (Node *) makeA_Expr(OP, $2 , $1 , NULL ); }
5893
- | b_expr IS DISTINCT FROM b_expr %prec Op
5901
+ | b_expr IS DISTINCT FROM b_expr %prec IS
5894
5902
{ $$ = (Node *) makeSimpleA_Expr(DISTINCT, " =" , $1 , $5 ); }
5895
- | b_expr IS OF ' (' type_list ' )'
5903
+ | b_expr IS OF ' (' type_list ' )' %prec IS
5896
5904
{
5897
5905
$$ = (Node *) makeSimpleA_Expr(OF, " =" , $1 , (Node *) $5 );
5898
5906
}
5899
- | b_expr IS NOT OF ' (' type_list ' )'
5907
+ | b_expr IS NOT OF ' (' type_list ' )' %prec IS
5900
5908
{
5901
5909
$$ = (Node *) makeSimpleA_Expr(OF, " !=" , $1 , (Node *) $6 );
5902
5910
}
0 commit comments