11
11
*
12
12
*
13
13
* IDENTIFICATION
14
- * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.449 2004/03/17 20:48:42 tgl Exp $
14
+ * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.450 2004/04/05 03:07:26 momjian Exp $
15
15
*
16
16
* HISTORY
17
17
* AUTHOR DATE MAJOR EVENT
@@ -194,7 +194,7 @@ static void doNegateFloat(Value *v);
194
194
database_name access_method_clause access_method attr_name
195
195
index_name name function_name file_name
196
196
197
- %type <list> func_name handler_name qual_Op qual_all_Op
197
+ %type <list> func_name handler_name qual_Op qual_all_Op subquery_Op
198
198
opt_class opt_validator
199
199
200
200
%type <range> qualified_name OptConstrFromTable
@@ -5692,7 +5692,7 @@ r_expr: row IN_P select_with_parens
5692
5692
/* Stick a NOT on top */
5693
5693
$$ = (Node *) makeA_Expr (AEXPR_NOT, NIL, NULL , (Node *) n);
5694
5694
}
5695
- | row qual_all_Op sub_type select_with_parens
5695
+ | row subquery_Op sub_type select_with_parens
5696
5696
%prec Op
5697
5697
{
5698
5698
SubLink *n = makeNode (SubLink);
@@ -5702,7 +5702,7 @@ r_expr: row IN_P select_with_parens
5702
5702
n->subselect = $4 ;
5703
5703
$$ = (Node *)n;
5704
5704
}
5705
- | row qual_all_Op select_with_parens
5705
+ | row subquery_Op select_with_parens
5706
5706
%prec Op
5707
5707
{
5708
5708
SubLink *n = makeNode (SubLink);
@@ -5712,7 +5712,7 @@ r_expr: row IN_P select_with_parens
5712
5712
n->subselect = $3 ;
5713
5713
$$ = (Node *)n;
5714
5714
}
5715
- | row qual_all_Op row
5715
+ | row subquery_Op row
5716
5716
%prec Op
5717
5717
{
5718
5718
$$ = makeRowExpr ($2 , $1 , $3 );
@@ -5807,6 +5807,23 @@ qual_all_Op:
5807
5807
| OPERATOR ' (' any_operator ' )' { $$ = $3 ; }
5808
5808
;
5809
5809
5810
+ subquery_Op:
5811
+ all_Op { $$ = makeList1 (makeString ($1 )); }
5812
+ | OPERATOR ' (' any_operator ' )' { $$ = $3 ; }
5813
+ | LIKE { $$ = makeList1 (makeString (" ~~" )); }
5814
+ | NOT LIKE { $$ = makeList1 (makeString (" !~~" )); }
5815
+ | ILIKE { $$ = makeList1 (makeString (" ~~*" )); }
5816
+ | NOT ILIKE { $$ = makeList1 (makeString (" !~~*" )); }
5817
+ /* cannot put SIMILAR TO here, because SIMILAR TO is a hack.
5818
+ * the regular expression is preprocessed by a function (similar_escape),
5819
+ * and the ~ operator for posix regular expressions is used.
5820
+ * x SIMILAR TO y -> x ~ similar_escape(y)
5821
+ * this transformation is made on the fly by the parser upwards.
5822
+ * however the SubLink structure which handles any/some/all stuff
5823
+ * is not ready for such a thing.
5824
+ */
5825
+ ;
5826
+
5810
5827
/*
5811
5828
* General expressions
5812
5829
* This is the heart of the expression syntax.
@@ -6132,7 +6149,7 @@ a_expr: c_expr { $$ = $1; }
6132
6149
$$ = n;
6133
6150
}
6134
6151
}
6135
- | a_expr qual_all_Op sub_type select_with_parens %prec Op
6152
+ | a_expr subquery_Op sub_type select_with_parens %prec Op
6136
6153
{
6137
6154
SubLink *n = makeNode (SubLink);
6138
6155
n->subLinkType = $3 ;
@@ -6141,7 +6158,7 @@ a_expr: c_expr { $$ = $1; }
6141
6158
n->subselect = $4 ;
6142
6159
$$ = (Node *)n;
6143
6160
}
6144
- | a_expr qual_all_Op sub_type ' (' a_expr ' )' %prec Op
6161
+ | a_expr subquery_Op sub_type ' (' a_expr ' )' %prec Op
6145
6162
{
6146
6163
if ($3 == ANY_SUBLINK)
6147
6164
$$ = (Node *) makeA_Expr (AEXPR_OP_ANY, $2 , $1 , $5 );
0 commit comments