Skip to content
Snippets Groups Projects
Commit 7c1e67bd authored by Thomas G. Lockhart's avatar Thomas G. Lockhart
Browse files

Implement IS OF type predicate. Can now do queries of the form:

 select value IS OF (integer, float8);
parent b71310d8
No related branches found
No related tags found
No related merge requests found
......@@ -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:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment