@@ -99,6 +99,7 @@ static Node *makeOrExpr(Node *lexpr, Node *rexpr, int location);
99
99
static Node *makeNotExpr (Node *expr, int location);
100
100
static Node *makeAConst (Value *v, int location);
101
101
static Node *makeAArrayExpr (List *elements, int location);
102
+ static Node *makeXmlExpr (XmlExprOp op, char *name, List *named_args, List *args, int location);
102
103
103
104
#define parser_yyerror (msg ) scanner_yyerror(msg, yyscanner)
104
105
#define parser_errposition (pos ) scanner_errposition(pos, yyscanner)
@@ -151,7 +152,7 @@ static Node *makeAArrayExpr(List *elements, int location);
151
152
%token NOT_EQ LT_EQ GT_EQ DOT_DOT TYPECAST PLUS_EQ
152
153
153
154
/* keywords in alphabetical order */
154
- %token <keyword> ALL AND ANY ARRAY AS ASC ASCENDING ASYMMETRIC
155
+ %token <keyword> ALL AND ANY ARRAY AS ASC ASCENDING ASYMMETRIC AT
155
156
156
157
BETWEEN BOTH BY
157
158
@@ -160,7 +161,7 @@ static Node *makeAArrayExpr(List *elements, int location);
160
161
CURRENT_CATALOG CURRENT_DATE CURRENT_ROLE CURRENT_SCHEMA CURRENT_TIME
161
162
CURRENT_TIMESTAMP CURRENT_USER
162
163
163
- DATE DECADE DEFAULT DELETE DESC DESCENDING DETACH DISTINCT DROP
164
+ DATE DECADE DEFAULT DELETE DESC DESCENDING DETACH DISTINCT DOCUMENT_P DROP
164
165
165
166
ELSE END_P ENDS ESCAPE EXCEPT EXCLUDE EXISTS EXTENSION EXTRACT
166
167
@@ -177,7 +178,7 @@ static Node *makeAArrayExpr(List *elements, int location);
177
178
178
179
MATCH MERGE
179
180
180
- NATURAL NFC NFD NFKC NFKD NO NORMALIZE NOT NOTNULL NULL_P NULLIF NULLS_LA
181
+ NATURAL NFC NFD NFKC NFKD NO NORMALIZE NORMALIZED NOT NOTNULL NULL_P NULLIF NULLS_LA
181
182
182
183
ON ONLY OPTIONAL OTHERS OR ORDER OUTER OVER OVERLAPS OVERLAY
183
184
@@ -189,7 +190,7 @@ static Node *makeAArrayExpr(List *elements, int location);
189
190
190
191
TABLE TEMP TEMPORARY TIME TIES THEN TIMESTAMP TO TRAILING TREAT TRIM TRUE_P
191
192
192
- UNBOUNDED UNION UNKNOWN UNLOGGED UPDATE UNWIND USE USER USING
193
+ UNBOUNDED UNION UNIQUE UNKNOWN UNLOGGED UPDATE UNWIND USE USER USING
193
194
194
195
VALUES VARIADIC VERSION_P
195
196
@@ -334,7 +335,10 @@ static Node *makeAArrayExpr(List *elements, int location);
334
335
any_name attrs opt_class
335
336
var_list
336
337
337
- %type <list> func_name
338
+ %type <list> func_name qual_Op qual_all_Op subquery_Op
339
+ %type <string> all_Op MathOp
340
+
341
+ %type <integer> sub_type
338
342
339
343
%type <defelt> def_elem reloption_elem
340
344
%type <string> Sconst
@@ -1224,6 +1228,56 @@ explicit_row: ROW '(' expr_list ')' { $$ = $3; }
1224
1228
implicit_row : ' (' expr_list ' ,' a_expr ' )' { $$ = lappend($2 , $4 ); }
1225
1229
;
1226
1230
1231
+ sub_type : ANY { $$ = ANY_SUBLINK; }
1232
+ | SOME { $$ = ANY_SUBLINK; }
1233
+ | ALL { $$ = ALL_SUBLINK; }
1234
+ ;
1235
+
1236
+ all_Op : OPERATOR { $$ = $1 ; }
1237
+ | MathOp { $$ = $1 ; }
1238
+ ;
1239
+
1240
+ MathOp : ' +' { $$ = " +" ; }
1241
+ | ' -' { $$ = " -" ; }
1242
+ | ' *' { $$ = " *" ; }
1243
+ | ' /' { $$ = " /" ; }
1244
+ | ' %' { $$ = " %" ; }
1245
+ | ' ^' { $$ = " ^" ; }
1246
+ | ' <' { $$ = " <" ; }
1247
+ | ' >' { $$ = " >" ; }
1248
+ | ' =' { $$ = " =" ; }
1249
+ | LT_EQ { $$ = " <=" ; }
1250
+ | GT_EQ { $$ = " >=" ; }
1251
+ | NOT_EQ { $$ = " <>" ; }
1252
+ ;
1253
+
1254
+ qual_Op : OPERATOR
1255
+ { $$ = list_make1(makeString($1 )); }
1256
+ //| OPERATOR ' (' any_operator ' )'
1257
+ // { $$ = $3 ; }
1258
+ ;
1259
+
1260
+ qual_all_Op :
1261
+ all_Op
1262
+ { $$ = list_make1(makeString($1 )); }
1263
+ //| OPERATOR ' (' any_operator ' )'
1264
+ // { $$ = $3 ; }
1265
+ ;
1266
+
1267
+ subquery_Op :
1268
+ all_Op
1269
+ { $$ = list_make1(makeString($1 )); }
1270
+ //| OPERATOR ' (' any_operator ' )'
1271
+ // { $$ = $3 ; }
1272
+ | LIKE
1273
+ { $$ = list_make1(makeString(" ~~" )); }
1274
+ | NOT LIKE
1275
+ { $$ = list_make1(makeString(" !~~" )); }
1276
+ | ILIKE
1277
+ { $$ = list_make1(makeString(" ~~*" )); }
1278
+ | NOT ILIKE
1279
+ { $$ = list_make1(makeString(" !~~*" )); }
1280
+
1227
1281
/* ****************************************************************************
1228
1282
*
1229
1283
* QUERY:
@@ -2808,21 +2862,21 @@ opt_slice_bound:
2808
2862
a_expr : c_expr { $$ = $1 ; }
2809
2863
| a_expr TYPECAST Typename
2810
2864
{ $$ = makeTypeCast($1 , $3 , @2 ); }
2811
- /* | a_expr COLLATE any_name
2865
+ | a_expr COLLATE any_name
2812
2866
{
2813
2867
CollateClause *n = makeNode(CollateClause);
2814
2868
n->arg = $1 ;
2815
2869
n->collname = $3 ;
2816
2870
n->location = @2 ;
2817
2871
$$ = (Node *) n;
2818
2872
}
2819
- | a_expr AT TIME ZONE a_expr %prec AT
2873
+ | a_expr AT TIME ZONE a_expr // %prec AT
2820
2874
{
2821
2875
$$ = (Node *) makeFuncCall(SystemFuncName(" timezone" ),
2822
2876
list_make2 ($5 , $1 ),
2823
2877
COERCE_SQL_SYNTAX,
2824
2878
@2);
2825
- }*/
2879
+ }
2826
2880
| ' +' a_expr // %prec ;
2827
2881
{ $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", NULL, $2, @1); }
2828
2882
| '-' a_expr // %prec UMINUS
@@ -2851,12 +2905,10 @@ a_expr: c_expr { $$ = $1; }
2851
2905
{ $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, ">=", $1, $3, @2); }
2852
2906
| a_expr NOT_EQ a_expr
2853
2907
{ $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<>", $1, $3, @2); }
2854
- /*
2855
- | a_expr OPERATOR a_expr // %prec Op
2908
+ | a_expr qual_Op a_expr %prec OPERATOR
2856
2909
{ $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, $3, @2); }
2857
- | OPERATOR a_expr // %prec Op
2910
+ | qual_Op a_expr %prec OPERATOR
2858
2911
{ $$ = (Node *) makeA_Expr(AEXPR_OP, $1, NULL, $2, @1); }
2859
- */
2860
2912
| a_expr AND a_expr
2861
2913
{ $$ = makeAndExpr($1, $3, @2); }
2862
2914
| a_expr OR a_expr
@@ -2987,23 +3039,21 @@ a_expr: c_expr { $$ = $1; }
2987
3039
n->location = @2;
2988
3040
$$ = (Node *)n;
2989
3041
}
2990
- /* | row OVERLAPS row
3042
+ | row OVERLAPS row
2991
3043
{
2992
3044
if (list_length($1) != 2)
2993
3045
ereport(ERROR,
2994
3046
(errcode(ERRCODE_SYNTAX_ERROR),
2995
- errmsg("wrong number of parameters on left side of OVERLAPS expression"),
2996
- parser_errposition(@1)));
3047
+ errmsg("wrong number of parameters on left side of OVERLAPS expression")));
2997
3048
if (list_length($3) != 2)
2998
3049
ereport(ERROR,
2999
3050
(errcode(ERRCODE_SYNTAX_ERROR),
3000
- errmsg("wrong number of parameters on right side of OVERLAPS expression"),
3001
- parser_errposition(@3)));
3051
+ errmsg("wrong number of parameters on right side of OVERLAPS expression")));
3002
3052
$$ = (Node *) makeFuncCall(SystemFuncName("overlaps"),
3003
3053
list_concat($1, $3),
3004
3054
COERCE_SQL_SYNTAX,
3005
3055
@2);
3006
- }*/
3056
+ }
3007
3057
| a_expr IS TRUE_P %prec IS
3008
3058
{
3009
3059
BooleanTest *b = makeNode(BooleanTest);
@@ -3125,8 +3175,8 @@ a_expr: c_expr { $$ = $1; }
3125
3175
{
3126
3176
$$ = (Node *) makeSimpleA_Expr(AEXPR_IN, "<>", $1, $4, @2);
3127
3177
}
3128
- }/*
3129
- | a_expr subquery_Op sub_type select_with_parens %prec Op
3178
+ }
3179
+ | a_expr subquery_Op sub_type select_with_parens %prec OPERATOR
3130
3180
{
3131
3181
SubLink *n = makeNode(SubLink);
3132
3182
n->subLinkType = $3;
@@ -3137,7 +3187,7 @@ a_expr: c_expr { $$ = $1; }
3137
3187
n->location = @2;
3138
3188
$$ = (Node *)n;
3139
3189
}
3140
- | a_expr subquery_Op sub_type '(' a_expr ')' %prec Op
3190
+ | a_expr subquery_Op sub_type '(' a_expr ')' %prec OPERATOR
3141
3191
{
3142
3192
if ($3 == ANY_SUBLINK)
3143
3193
$$ = (Node *) makeA_Expr(AEXPR_OP_ANY, $2, $1, $5, @2);
@@ -3148,8 +3198,7 @@ a_expr: c_expr { $$ = $1; }
3148
3198
{
3149
3199
ereport(ERROR,
3150
3200
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3151
- errmsg("UNIQUE predicate is not yet implemented"),
3152
- parser_errposition(@1)));
3201
+ errmsg("UNIQUE predicate is not yet implemented")));
3153
3202
}
3154
3203
| a_expr IS DOCUMENT_P %prec IS
3155
3204
{
@@ -3198,7 +3247,7 @@ a_expr: c_expr { $$ = $1; }
3198
3247
SetToDefault *n = makeNode(SetToDefault);
3199
3248
n->location = @1;
3200
3249
$$ = (Node *)n;
3201
- }*/
3250
+ }
3202
3251
;
3203
3252
3204
3253
@@ -3246,10 +3295,10 @@ b_expr: c_expr
3246
3295
{ $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, " >=" , $1 , $3 , @2 ); }
3247
3296
| b_expr NOT_EQ b_expr
3248
3297
{ $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, " <>" , $1 , $3 , @2 ); }
3249
- /* | b_expr qual_Op b_expr %prec Op
3298
+ | b_expr qual_Op b_expr %prec OPERATOR
3250
3299
{ $$ = (Node *) makeA_Expr(AEXPR_OP, $2 , $1 , $3 , @2 ); }
3251
- | qual_Op b_expr %prec Op
3252
- { $$ = (Node *) makeA_Expr(AEXPR_OP, $1, NULL, $2, @1); }*/
3300
+ | qual_Op b_expr %prec OPERATOR
3301
+ { $$ = (Node *) makeA_Expr(AEXPR_OP, $1 , NULL , $2 , @1 ); }
3253
3302
| b_expr IS DISTINCT FROM b_expr %prec IS
3254
3303
{
3255
3304
$$ = (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, " =" , $1 , $5 , @2 );
@@ -3258,7 +3307,7 @@ b_expr: c_expr
3258
3307
{
3259
3308
$$ = (Node *) makeSimpleA_Expr(AEXPR_NOT_DISTINCT, " =" , $1 , $6 , @2 );
3260
3309
}
3261
- /* | b_expr IS DOCUMENT_P %prec IS
3310
+ | b_expr IS DOCUMENT_P %prec IS
3262
3311
{
3263
3312
$$ = makeXmlExpr(IS_DOCUMENT, NULL , NIL,
3264
3313
list_make1 ($1 ), @2);
@@ -3268,7 +3317,7 @@ b_expr: c_expr
3268
3317
$$ = makeNotExpr(makeXmlExpr(IS_DOCUMENT, NULL , NIL,
3269
3318
list_make1 ($1 ), @2),
3270
3319
@2);
3271
- }*/
3320
+ }
3272
3321
;
3273
3322
3274
3323
/*
@@ -6127,8 +6176,7 @@ insertSelectOptions(SelectStmt *stmt,
6127
6176
if (stmt->sortClause)
6128
6177
ereport(ERROR,
6129
6178
(errcode(ERRCODE_SYNTAX_ERROR),
6130
- errmsg("multiple ORDER BY clauses not allowed"),
6131
- parser_errposition(exprLocation((Node *) sortClause))));
6179
+ errmsg("multiple ORDER BY clauses not allowed")));
6132
6180
stmt->sortClause = sortClause;
6133
6181
}
6134
6182
/* We can handle multiple locking clauses, though */
@@ -6138,17 +6186,15 @@ insertSelectOptions(SelectStmt *stmt,
6138
6186
if (stmt->limitOffset)
6139
6187
ereport(ERROR,
6140
6188
(errcode(ERRCODE_SYNTAX_ERROR),
6141
- errmsg("multiple OFFSET clauses not allowed"),
6142
- parser_errposition(exprLocation(limitClause->limitOffset))));
6189
+ errmsg("multiple OFFSET clauses not allowed")));
6143
6190
stmt->limitOffset = limitClause->limitOffset;
6144
6191
}
6145
6192
if (limitClause && limitClause->limitCount)
6146
6193
{
6147
6194
if (stmt->limitCount)
6148
6195
ereport(ERROR,
6149
6196
(errcode(ERRCODE_SYNTAX_ERROR),
6150
- errmsg("multiple LIMIT clauses not allowed"),
6151
- parser_errposition(exprLocation(limitClause->limitCount))));
6197
+ errmsg("multiple LIMIT clauses not allowed")));
6152
6198
stmt->limitCount = limitClause->limitCount;
6153
6199
}
6154
6200
if (limitClause && limitClause->limitOption != LIMIT_OPTION_DEFAULT)
@@ -6362,3 +6408,26 @@ makeAArrayExpr(List *elements, int location)
6362
6408
n->location = location;
6363
6409
return (Node *) n;
6364
6410
}
6411
+
6412
+
6413
+ static Node *
6414
+ makeXmlExpr(XmlExprOp op, char *name, List *named_args, List *args,
6415
+ int location)
6416
+ {
6417
+ XmlExpr *x = makeNode(XmlExpr);
6418
+
6419
+ x->op = op;
6420
+ x->name = name;
6421
+ /*
6422
+ * named_args is a list of ResTarget; it'll be split apart into separate
6423
+ * expression and name lists in transformXmlExpr().
6424
+ */
6425
+ x->named_args = named_args;
6426
+ x->arg_names = NIL;
6427
+ x->args = args;
6428
+ /* xmloption, if relevant, must be filled in by caller */
6429
+ /* type and typmod will be filled in during parse analysis */
6430
+ x->type = InvalidOid; /* marks the node as not analyzed */
6431
+ x->location = location;
6432
+ return (Node *) x;
6433
+ }
0 commit comments