aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/parser')
-rw-r--r--src/backend/parser/gram.y22
-rw-r--r--src/backend/parser/parse_expr.c11
-rw-r--r--src/backend/parser/parse_target.c5
3 files changed, 34 insertions, 4 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 6abe0d6795a..db66a69b3ff 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -11,7 +11,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.573 2007/01/09 02:14:14 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.574 2007/01/14 13:11:53 petere Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -7147,6 +7147,16 @@ a_expr: c_expr { $$ = $1; }
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("UNIQUE predicate is not yet implemented")));
}
+ | a_expr IS DOCUMENT_P %prec IS
+ {
+ $$ = makeXmlExpr(IS_DOCUMENT, NULL, NIL, list_make1($1));
+ }
+ | a_expr IS NOT DOCUMENT_P %prec IS
+ {
+ $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL, NULL,
+ makeXmlExpr(IS_DOCUMENT, NULL, NIL, list_make1($1)),
+ @2);
+ }
;
/*
@@ -7207,6 +7217,16 @@ b_expr: c_expr
{
$$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "<>", $1, (Node *) $6, @2);
}
+ | b_expr IS DOCUMENT_P %prec IS
+ {
+ $$ = makeXmlExpr(IS_DOCUMENT, NULL, NIL, list_make1($1));
+ }
+ | b_expr IS NOT DOCUMENT_P %prec IS
+ {
+ $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL, NULL,
+ makeXmlExpr(IS_DOCUMENT, NULL, NIL, list_make1($1)),
+ @2);
+ }
;
/*
diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c
index d9e42011d41..394a507f2ef 100644
--- a/src/backend/parser/parse_expr.c
+++ b/src/backend/parser/parse_expr.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/parser/parse_expr.c,v 1.207 2007/01/12 22:09:49 petere Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/parse_expr.c,v 1.208 2007/01/14 13:11:53 petere Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1483,6 +1483,10 @@ transformXmlExpr(ParseState *pstate, XmlExpr *x)
else
newe = coerce_to_boolean(pstate, newe, "XMLROOT");
break;
+ case IS_DOCUMENT:
+ newe = coerce_to_specific_type(pstate, newe, XMLOID,
+ "IS DOCUMENT");
+ break;
}
newx->args = lappend(newx->args, newe);
i++;
@@ -1782,7 +1786,10 @@ exprType(Node *expr)
type = ((MinMaxExpr *) expr)->minmaxtype;
break;
case T_XmlExpr:
- type = XMLOID;
+ if (((XmlExpr *) expr)->op == IS_DOCUMENT)
+ type = BOOLOID;
+ else
+ type = XMLOID;
break;
case T_NullIfExpr:
type = exprType((Node *) linitial(((NullIfExpr *) expr)->args));
diff --git a/src/backend/parser/parse_target.c b/src/backend/parser/parse_target.c
index 3a4caa81f81..dea29d1d8aa 100644
--- a/src/backend/parser/parse_target.c
+++ b/src/backend/parser/parse_target.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/parser/parse_target.c,v 1.152 2007/01/05 22:19:34 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/parse_target.c,v 1.153 2007/01/14 13:11:54 petere Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1337,6 +1337,9 @@ FigureColnameInternal(Node *node, char **name)
case IS_XMLROOT:
*name = "xmlroot";
return 2;
+ case IS_DOCUMENT:
+ /* nothing */
+ break;
}
break;
default: