diff options
author | Thomas G. Lockhart <lockhart@fourpalms.org> | 2002-08-04 06:46:12 +0000 |
---|---|---|
committer | Thomas G. Lockhart <lockhart@fourpalms.org> | 2002-08-04 06:46:12 +0000 |
commit | 7c1e67bd5210054258340c05b73d641b78b8c51c (patch) | |
tree | c271f2a38c7cd473819b2ac75740d3424eb18e26 /src/backend/parser/parse_expr.c | |
parent | b71310d8e02f8f0b3006aa5e634f9218f0f0cedc (diff) | |
download | postgresql-7c1e67bd5210054258340c05b73d641b78b8c51c.tar.gz postgresql-7c1e67bd5210054258340c05b73d641b78b8c51c.zip |
Implement IS OF type predicate. Can now do queries of the form:
select value IS OF (integer, float8);
Diffstat (limited to 'src/backend/parser/parse_expr.c')
-rw-r--r-- | src/backend/parser/parse_expr.c | 53 |
1 files changed, 44 insertions, 9 deletions
diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index f538448932e..3cd09a9b43c 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: |