@@ -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; }
1111411115 n->operName = list_make1(makeString(" =" ));
1111511116 n->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 }
1111911120 else
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)
1369213692 v->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{
0 commit comments