diff options
Diffstat (limited to 'src/backend/parser')
-rw-r--r-- | src/backend/parser/gram.y | 22 | ||||
-rw-r--r-- | src/backend/parser/parse_expr.c | 11 | ||||
-rw-r--r-- | src/backend/parser/parse_target.c | 5 |
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: |