diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 933a1a2..2fb0418 100644
*** a/src/backend/parser/gram.y
--- b/src/backend/parser/gram.y
*************** static void SplitColQualList(List *qualL
*** 614,620 ****
  %left		Op OPERATOR		/* multi-character ops and user-defined operators */
  %nonassoc	NOTNULL
  %nonassoc	ISNULL
! %nonassoc	IS NULL_P TRUE_P FALSE_P UNKNOWN /* sets precedence for IS NULL, etc */
  %left		'+' '-'
  %left		'*' '/' '%'
  %left		'^'
--- 614,620 ----
  %left		Op OPERATOR		/* multi-character ops and user-defined operators */
  %nonassoc	NOTNULL
  %nonassoc	ISNULL
! %nonassoc	IS				/* sets precedence for IS NULL, etc */
  %left		'+' '-'
  %left		'*' '/' '%'
  %left		'^'
*************** a_expr:		c_expr									{ $$ = $1; }
*** 9887,9893 ****
  			 *	a ISNULL
  			 *	a NOTNULL
  			 */
! 			| a_expr IS NULL_P
  				{
  					NullTest *n = makeNode(NullTest);
  					n->arg = (Expr *) $1;
--- 9887,9893 ----
  			 *	a ISNULL
  			 *	a NOTNULL
  			 */
! 			| a_expr IS NULL_P							%prec IS
  				{
  					NullTest *n = makeNode(NullTest);
  					n->arg = (Expr *) $1;
*************** a_expr:		c_expr									{ $$ = $1; }
*** 9901,9907 ****
  					n->nulltesttype = IS_NULL;
  					$$ = (Node *)n;
  				}
! 			| a_expr IS NOT NULL_P
  				{
  					NullTest *n = makeNode(NullTest);
  					n->arg = (Expr *) $1;
--- 9901,9907 ----
  					n->nulltesttype = IS_NULL;
  					$$ = (Node *)n;
  				}
! 			| a_expr IS NOT NULL_P						%prec IS
  				{
  					NullTest *n = makeNode(NullTest);
  					n->arg = (Expr *) $1;
*************** a_expr:		c_expr									{ $$ = $1; }
*** 9919,9960 ****
  				{
  					$$ = (Node *)makeOverlaps($1, $3, @2, yyscanner);
  				}
! 			| a_expr IS TRUE_P
  				{
  					BooleanTest *b = makeNode(BooleanTest);
  					b->arg = (Expr *) $1;
  					b->booltesttype = IS_TRUE;
  					$$ = (Node *)b;
  				}
! 			| a_expr IS NOT TRUE_P
  				{
  					BooleanTest *b = makeNode(BooleanTest);
  					b->arg = (Expr *) $1;
  					b->booltesttype = IS_NOT_TRUE;
  					$$ = (Node *)b;
  				}
! 			| a_expr IS FALSE_P
  				{
  					BooleanTest *b = makeNode(BooleanTest);
  					b->arg = (Expr *) $1;
  					b->booltesttype = IS_FALSE;
  					$$ = (Node *)b;
  				}
! 			| a_expr IS NOT FALSE_P
  				{
  					BooleanTest *b = makeNode(BooleanTest);
  					b->arg = (Expr *) $1;
  					b->booltesttype = IS_NOT_FALSE;
  					$$ = (Node *)b;
  				}
! 			| a_expr IS UNKNOWN
  				{
  					BooleanTest *b = makeNode(BooleanTest);
  					b->arg = (Expr *) $1;
  					b->booltesttype = IS_UNKNOWN;
  					$$ = (Node *)b;
  				}
! 			| a_expr IS NOT UNKNOWN
  				{
  					BooleanTest *b = makeNode(BooleanTest);
  					b->arg = (Expr *) $1;
--- 9919,9960 ----
  				{
  					$$ = (Node *)makeOverlaps($1, $3, @2, yyscanner);
  				}
! 			| a_expr IS TRUE_P							%prec IS
  				{
  					BooleanTest *b = makeNode(BooleanTest);
  					b->arg = (Expr *) $1;
  					b->booltesttype = IS_TRUE;
  					$$ = (Node *)b;
  				}
! 			| a_expr IS NOT TRUE_P						%prec IS
  				{
  					BooleanTest *b = makeNode(BooleanTest);
  					b->arg = (Expr *) $1;
  					b->booltesttype = IS_NOT_TRUE;
  					$$ = (Node *)b;
  				}
! 			| a_expr IS FALSE_P							%prec IS
  				{
  					BooleanTest *b = makeNode(BooleanTest);
  					b->arg = (Expr *) $1;
  					b->booltesttype = IS_FALSE;
  					$$ = (Node *)b;
  				}
! 			| a_expr IS NOT FALSE_P						%prec IS
  				{
  					BooleanTest *b = makeNode(BooleanTest);
  					b->arg = (Expr *) $1;
  					b->booltesttype = IS_NOT_FALSE;
  					$$ = (Node *)b;
  				}
! 			| a_expr IS UNKNOWN							%prec IS
  				{
  					BooleanTest *b = makeNode(BooleanTest);
  					b->arg = (Expr *) $1;
  					b->booltesttype = IS_UNKNOWN;
  					$$ = (Node *)b;
  				}
! 			| a_expr IS NOT UNKNOWN						%prec IS
  				{
  					BooleanTest *b = makeNode(BooleanTest);
  					b->arg = (Expr *) $1;
