@@ -151,6 +151,9 @@ static void insertSelectOptions(SelectStmt *stmt,
151151static Node *makeSetOp (SetOperation op,bool all, Node *larg, Node *rarg);
152152static Node *doNegate (Node *n,int location);
153153static void doNegateFloat (Value *v);
154+ static Node *makeAndExpr (Node *lexpr, Node *rexpr,int location);
155+ static Node *makeOrExpr (Node *lexpr, Node *rexpr,int location);
156+ static Node *makeNotExpr (Node *expr,int location);
154157static Node *makeAArrayExpr (List *elements,int location);
155158static Node *makeXmlExpr (XmlExprOp op,char *name, List *named_args,
156159 List *args,int location);
@@ -10849,11 +10852,11 @@ a_expr:c_expr{ $$ = $1; }
1084910852{$$ = (Node *) makeA_Expr(AEXPR_OP,$2 ,$1 ,NULL ,@2 ); }
1085010853
1085110854| a_expr AND a_expr
10852- {$$ =(Node *) makeA_Expr(AEXPR_AND, NIL, $1 ,$3 ,@2 ); }
10855+ {$$ =makeAndExpr( $1 ,$3 ,@2 ); }
1085310856| a_expr OR a_expr
10854- {$$ =(Node *) makeA_Expr(AEXPR_OR, NIL, $1 ,$3 ,@2 ); }
10857+ {$$ =makeOrExpr( $1 ,$3 ,@2 ); }
1085510858| NOT a_expr
10856- {$$ =(Node *) makeA_Expr(AEXPR_NOT, NIL, NULL , $2 ,@1 ); }
10859+ {$$ =makeNotExpr( $2 ,@1 ); }
1085710860
1085810861| a_expr LIKE a_expr
1085910862{$$ = (Node *) makeSimpleA_Expr(AEXPR_OP," ~~" ,$1 ,$3 ,@2 ); }
@@ -11022,11 +11025,9 @@ a_expr:c_expr{ $$ = $1; }
1102211025}
1102311026| a_expr IS NOT DISTINCT FROM a_expr %prec IS
1102411027{
11025- $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL,NULL ,
11026- (Node *) makeSimpleA_Expr(AEXPR_DISTINCT,
11027- " =" ,$1 ,$6 ,@2 ),
11028- @2 );
11029-
11028+ $$ = makeNotExpr((Node *) makeSimpleA_Expr(AEXPR_DISTINCT,
11029+ " =" ,$1 ,$6 ,@2 ),
11030+ @2 );
1103011031}
1103111032| a_expr IS OF ' (' type_list ' )' %prec IS
1103211033{
@@ -11044,43 +11045,43 @@ a_expr:c_expr{ $$ = $1; }
1104411045*/
1104511046| a_expr BETWEEN opt_asymmetric b_expr AND b_expr %prec BETWEEN
1104611047{
11047- $$ =(Node *) makeA_Expr(AEXPR_AND, NIL,
11048+ $$ =makeAndExpr(
1104811049(Node *) makeSimpleA_Expr(AEXPR_OP," >=" ,$1 ,$4 ,@2 ),
1104911050(Node *) makeSimpleA_Expr(AEXPR_OP," <=" ,$1 ,$6 ,@2 ),
11050- @2 );
11051+ @2 );
1105111052}
1105211053| a_expr NOT BETWEEN opt_asymmetric b_expr AND b_expr %prec BETWEEN
1105311054{
11054- $$ =(Node *) makeA_Expr(AEXPR_OR, NIL,
11055+ $$ =makeOrExpr(
1105511056(Node *) makeSimpleA_Expr(AEXPR_OP," <" ,$1 ,$5 ,@2 ),
1105611057(Node *) makeSimpleA_Expr(AEXPR_OP," >" ,$1 ,$7 ,@2 ),
11057- @2 );
11058+ @2 );
1105811059}
1105911060| a_expr BETWEEN SYMMETRIC b_expr AND b_expr %prec BETWEEN
1106011061{
11061- $$ =(Node *) makeA_Expr(AEXPR_OR, NIL,
11062- (Node *) makeA_Expr(AEXPR_AND, NIL,
11062+ $$ =makeOrExpr(
11063+ makeAndExpr (
1106311064(Node *) makeSimpleA_Expr(AEXPR_OP," >=" , $1 , $4 , @2 ),
1106411065(Node *) makeSimpleA_Expr(AEXPR_OP," <=" , $1 , $6 , @2 ),
11065- @2 ),
11066- (Node *) makeA_Expr(AEXPR_AND, NIL,
11066+ @2),
11067+ makeAndExpr(
1106711068(Node *) makeSimpleA_Expr(AEXPR_OP," >=" , $1 , $6 , @2 ),
1106811069(Node *) makeSimpleA_Expr(AEXPR_OP," <=" , $1 , $4 , @2 ),
11069- @2 ),
11070- @2 );
11070+ @2),
11071+ @2);
1107111072}
1107211073| a_expr NOT BETWEEN SYMMETRIC b_expr AND b_expr %prec BETWEEN
1107311074{
11074- $$ =(Node *) makeA_Expr(AEXPR_AND, NIL,
11075- (Node *) makeA_Expr(AEXPR_OR, NIL,
11075+ $$ =makeAndExpr(
11076+ makeOrExpr (
1107611077(Node *) makeSimpleA_Expr(AEXPR_OP," <" , $1 , $5 , @2 ),
1107711078(Node *) makeSimpleA_Expr(AEXPR_OP," >" , $1 , $7 , @2 ),
11078- @2 ),
11079- (Node *) makeA_Expr(AEXPR_OR, NIL,
11079+ @2),
11080+ makeOrExpr(
1108011081(Node *) makeSimpleA_Expr(AEXPR_OP," <" , $1 , $7 , @2 ),
1108111082(Node *) makeSimpleA_Expr(AEXPR_OP," >" , $1 , $5 , @2 ),
11082- @2 ),
11083- @2 );
11083+ @2),
11084+ @2);
1108411085}
1108511086| a_expr IN_P in_expr
1108611087{
@@ -11114,7 +11115,7 @@ a_expr:c_expr{ $$ = $1; }
1111411115n->operName = list_make1(makeString(" =" ));
1111511116n->location =@3 ;
1111611117/* Stick a NOT on top*/
11117- $$ =(Node *) makeA_Expr(AEXPR_NOT, NIL, NULL , (Node *) n,@2 );
11118+ $$ =makeNotExpr( (Node *) n,@2 );
1111811119}
1111911120else
1112011121{
@@ -11162,10 +11163,9 @@ a_expr:c_expr{ $$ = $1; }
1116211163}
1116311164| a_expr IS NOT DOCUMENT_P %prec IS
1116411165{
11165- $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL,NULL ,
11166- makeXmlExpr (IS_DOCUMENT,NULL , NIL,
11167- list_make1 ($1 ), @2),
11168- @2);
11166+ $$ = makeNotExpr(makeXmlExpr(IS_DOCUMENT,NULL , NIL,
11167+ list_make1 ($1 ), @2),
11168+ @2);
1116911169}
1117011170;
1117111171
@@ -11216,8 +11216,9 @@ b_expr:c_expr
1121611216}
1121711217| b_expr IS NOT DISTINCT FROM b_expr %prec IS
1121811218{
11219- $$ = (Node *)makeA_Expr (AEXPR_NOT, NIL,
11220- NULL , (Node *)makeSimpleA_Expr (AEXPR_DISTINCT," =" , $1 , $6 , @2 ), @2 );
11219+ $$ = makeNotExpr((Node *) makeSimpleA_Expr(AEXPR_DISTINCT,
11220+ " =" ,$1 ,$6 ,@2 ),
11221+ @2 );
1122111222}
1122211223| b_expr IS OF ' (' type_list ' )' %prec IS
1122311224{
@@ -11234,10 +11235,9 @@ b_expr:c_expr
1123411235}
1123511236| b_expr IS NOT DOCUMENT_P %prec IS
1123611237{
11237- $$ = (Node *)makeA_Expr (AEXPR_NOT, NIL,NULL ,
11238- makeXmlExpr (IS_DOCUMENT,NULL , NIL,
11239- list_make1 ($1 ), @2 ),
11240- @2 );
11238+ $$ = makeNotExpr(makeXmlExpr(IS_DOCUMENT,NULL , NIL,
11239+ list_make1 ($1 ), @2),
11240+ @2);
1124111241}
1124211242;
1124311243
@@ -13692,6 +13692,46 @@ doNegateFloat(Value *v)
1369213692v->val.str = psprintf("-%s", oldval);
1369313693}
1369413694
13695+ static Node *
13696+ makeAndExpr(Node *lexpr, Node *rexpr, int location)
13697+ {
13698+ /* Flatten "a AND b AND c ..." to a single BoolExpr on sight*/
13699+ if (IsA(lexpr, BoolExpr))
13700+ {
13701+ BoolExpr *blexpr = (BoolExpr *) lexpr;
13702+
13703+ if (blexpr->boolop == AND_EXPR)
13704+ {
13705+ blexpr->args = lappend(blexpr->args, rexpr);
13706+ return (Node *) blexpr;
13707+ }
13708+ }
13709+ return (Node *) makeBoolExpr(AND_EXPR, list_make2(lexpr, rexpr), location);
13710+ }
13711+
13712+ static Node *
13713+ makeOrExpr(Node *lexpr, Node *rexpr, int location)
13714+ {
13715+ /* Flatten "a OR b OR c ..." to a single BoolExpr on sight*/
13716+ if (IsA(lexpr, BoolExpr))
13717+ {
13718+ BoolExpr *blexpr = (BoolExpr *) lexpr;
13719+
13720+ if (blexpr->boolop == OR_EXPR)
13721+ {
13722+ blexpr->args = lappend(blexpr->args, rexpr);
13723+ return (Node *) blexpr;
13724+ }
13725+ }
13726+ return (Node *) makeBoolExpr(OR_EXPR, list_make2(lexpr, rexpr), location);
13727+ }
13728+
13729+ static Node *
13730+ makeNotExpr(Node *expr, int location)
13731+ {
13732+ return (Node *) makeBoolExpr(NOT_EXPR, list_make1(expr), location);
13733+ }
13734+
1369513735static Node *
1369613736makeAArrayExpr(List *elements, int location)
1369713737{