@@ -151,6 +151,9 @@ static void insertSelectOptions(SelectStmt *stmt,
151
151
static Node *makeSetOp (SetOperation op, bool all, Node *larg, Node *rarg);
152
152
static Node *doNegate (Node *n, int location);
153
153
static 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);
154
157
static Node *makeAArrayExpr (List *elements, int location);
155
158
static Node *makeXmlExpr (XmlExprOp op, char *name, List *named_args,
156
159
List *args, int location);
@@ -10849,11 +10852,11 @@ a_expr: c_expr { $$ = $1; }
10849
10852
{ $$ = (Node *) makeA_Expr(AEXPR_OP, $2 , $1 , NULL , @2 ); }
10850
10853
10851
10854
| a_expr AND a_expr
10852
- { $$ = (Node *) makeA_Expr(AEXPR_AND, NIL, $1 , $3 , @2 ); }
10855
+ { $$ = makeAndExpr( $1 , $3 , @2 ); }
10853
10856
| a_expr OR a_expr
10854
- { $$ = (Node *) makeA_Expr(AEXPR_OR, NIL, $1 , $3 , @2 ); }
10857
+ { $$ = makeOrExpr( $1 , $3 , @2 ); }
10855
10858
| NOT a_expr
10856
- { $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL, NULL , $2 , @1 ); }
10859
+ { $$ = makeNotExpr( $2 , @1 ); }
10857
10860
10858
10861
| a_expr LIKE a_expr
10859
10862
{ $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, " ~~" , $1 , $3 , @2 ); }
@@ -11022,11 +11025,9 @@ a_expr: c_expr { $$ = $1; }
11022
11025
}
11023
11026
| a_expr IS NOT DISTINCT FROM a_expr %prec IS
11024
11027
{
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 );
11030
11031
}
11031
11032
| a_expr IS OF ' (' type_list ' )' %prec IS
11032
11033
{
@@ -11044,43 +11045,43 @@ a_expr: c_expr { $$ = $1; }
11044
11045
*/
11045
11046
| a_expr BETWEEN opt_asymmetric b_expr AND b_expr %prec BETWEEN
11046
11047
{
11047
- $$ = (Node *) makeA_Expr(AEXPR_AND, NIL,
11048
+ $$ = makeAndExpr(
11048
11049
(Node *) makeSimpleA_Expr(AEXPR_OP, " >=" , $1 , $4 , @2 ),
11049
11050
(Node *) makeSimpleA_Expr(AEXPR_OP, " <=" , $1 , $6 , @2 ),
11050
- @2 );
11051
+ @2 );
11051
11052
}
11052
11053
| a_expr NOT BETWEEN opt_asymmetric b_expr AND b_expr %prec BETWEEN
11053
11054
{
11054
- $$ = (Node *) makeA_Expr(AEXPR_OR, NIL,
11055
+ $$ = makeOrExpr(
11055
11056
(Node *) makeSimpleA_Expr(AEXPR_OP, " <" , $1 , $5 , @2 ),
11056
11057
(Node *) makeSimpleA_Expr(AEXPR_OP, " >" , $1 , $7 , @2 ),
11057
- @2 );
11058
+ @2 );
11058
11059
}
11059
11060
| a_expr BETWEEN SYMMETRIC b_expr AND b_expr %prec BETWEEN
11060
11061
{
11061
- $$ = (Node *) makeA_Expr(AEXPR_OR, NIL,
11062
- (Node *) makeA_Expr(AEXPR_AND, NIL,
11062
+ $$ = makeOrExpr(
11063
+ makeAndExpr (
11063
11064
(Node *) makeSimpleA_Expr(AEXPR_OP, " >=" , $1 , $4 , @2 ),
11064
11065
(Node *) makeSimpleA_Expr(AEXPR_OP, " <=" , $1 , $6 , @2 ),
11065
- @2 ),
11066
- (Node *) makeA_Expr(AEXPR_AND, NIL,
11066
+ @2),
11067
+ makeAndExpr(
11067
11068
(Node *) makeSimpleA_Expr(AEXPR_OP, " >=" , $1 , $6 , @2 ),
11068
11069
(Node *) makeSimpleA_Expr(AEXPR_OP, " <=" , $1 , $4 , @2 ),
11069
- @2 ),
11070
- @2 );
11070
+ @2),
11071
+ @2);
11071
11072
}
11072
11073
| a_expr NOT BETWEEN SYMMETRIC b_expr AND b_expr %prec BETWEEN
11073
11074
{
11074
- $$ = (Node *) makeA_Expr(AEXPR_AND, NIL,
11075
- (Node *) makeA_Expr(AEXPR_OR, NIL,
11075
+ $$ = makeAndExpr(
11076
+ makeOrExpr (
11076
11077
(Node *) makeSimpleA_Expr(AEXPR_OP, " <" , $1 , $5 , @2 ),
11077
11078
(Node *) makeSimpleA_Expr(AEXPR_OP, " >" , $1 , $7 , @2 ),
11078
- @2 ),
11079
- (Node *) makeA_Expr(AEXPR_OR, NIL,
11079
+ @2),
11080
+ makeOrExpr(
11080
11081
(Node *) makeSimpleA_Expr(AEXPR_OP, " <" , $1 , $7 , @2 ),
11081
11082
(Node *) makeSimpleA_Expr(AEXPR_OP, " >" , $1 , $5 , @2 ),
11082
- @2 ),
11083
- @2 );
11083
+ @2),
11084
+ @2);
11084
11085
}
11085
11086
| a_expr IN_P in_expr
11086
11087
{
@@ -11114,7 +11115,7 @@ a_expr: c_expr { $$ = $1; }
11114
11115
n->operName = list_make1(makeString(" =" ));
11115
11116
n->location = @3 ;
11116
11117
/* Stick a NOT on top */
11117
- $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL, NULL , (Node *) n, @2 );
11118
+ $$ = makeNotExpr( (Node *) n, @2 );
11118
11119
}
11119
11120
else
11120
11121
{
@@ -11162,10 +11163,9 @@ a_expr: c_expr { $$ = $1; }
11162
11163
}
11163
11164
| a_expr IS NOT DOCUMENT_P %prec IS
11164
11165
{
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);
11169
11169
}
11170
11170
;
11171
11171
@@ -11216,8 +11216,9 @@ b_expr: c_expr
11216
11216
}
11217
11217
| b_expr IS NOT DISTINCT FROM b_expr %prec IS
11218
11218
{
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 );
11221
11222
}
11222
11223
| b_expr IS OF ' (' type_list ' )' %prec IS
11223
11224
{
@@ -11234,10 +11235,9 @@ b_expr: c_expr
11234
11235
}
11235
11236
| b_expr IS NOT DOCUMENT_P %prec IS
11236
11237
{
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);
11241
11241
}
11242
11242
;
11243
11243
@@ -13692,6 +13692,46 @@ doNegateFloat(Value *v)
13692
13692
v->val.str = psprintf("-%s", oldval);
13693
13693
}
13694
13694
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
+
13695
13735
static Node *
13696
13736
makeAArrayExpr(List *elements, int location)
13697
13737
{
0 commit comments