OSDN Git Service

Implement IS OF type predicate. Can now do queries of the form:
authorThomas G. Lockhart <lockhart@fourpalms.org>
Sun, 4 Aug 2002 06:46:12 +0000 (06:46 +0000)
committerThomas G. Lockhart <lockhart@fourpalms.org>
Sun, 4 Aug 2002 06:46:12 +0000 (06:46 +0000)
 select value IS OF (integer, float8);

src/backend/parser/parse_expr.c

index f538448..3cd09a9 100644 (file)
@@ -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: