From 7c1e67bd5210054258340c05b73d641b78b8c51c Mon Sep 17 00:00:00 2001 From: "Thomas G. Lockhart" Date: Sun, 4 Aug 2002 06:46:12 +0000 Subject: [PATCH] Implement IS OF type predicate. Can now do queries of the form: select value IS OF (integer, float8); --- src/backend/parser/parse_expr.c | 53 +++++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 9 deletions(-) diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index f538448932..3cd09a9b43 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.123 2002/07/18 17:14:19 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.124 2002/08/04 06:46:12 thomas Exp $ * *------------------------------------------------------------------------- */ @@ -282,6 +282,41 @@ transformExpr(ParseState *pstate, Node *expr) rexpr); ((Expr *)result)->opType = DISTINCT_EXPR; } + break; + case OF: + { + List *telem; + A_Const *n; + Oid ltype, rtype; + bool matched = FALSE; + + /* Checking an expression for match to type. + * Will result in a boolean constant node. + */ + Node *lexpr = transformExpr(pstate, + a->lexpr); + ltype = exprType(lexpr); + foreach(telem, (List *) a->rexpr) + { + rtype = LookupTypeName(lfirst(telem)); + matched = (rtype == ltype); + if (matched) break; + } + + /* Expect two forms: equals or not equals. + * Flip the sense of the result for not equals. + */ + if (strcmp(strVal(lfirst(a->name)), "!=") == 0) + matched = (! matched); + + n = makeNode(A_Const); + n->val.type = T_String; + n->val.val.str = (matched? "t": "f"); + n->typename = SystemTypeName("bool"); + + result = transformExpr(pstate, (Node *) n); + } + break; } break; } @@ -589,14 +624,14 @@ transformExpr(ParseState *pstate, Node *expr) break; } - /* - * Quietly accept node types that may be presented when we are - * called on an already-transformed tree. - * - * Do any other node types need to be accepted? For now we are - * taking a conservative approach, and only accepting node - * types that are demonstrably necessary to accept. - */ + /********************************************* + * Quietly accept node types that may be presented when we are + * called on an already-transformed tree. + * + * Do any other node types need to be accepted? For now we are + * taking a conservative approach, and only accepting node + * types that are demonstrably necessary to accept. + *********************************************/ case T_Expr: case T_Var: case T_Const: