]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Cast constants to the type of the other binary operand.
authorBruce Momjian <bruce@momjian.us>
Wed, 22 Jan 1997 01:44:02 +0000 (01:44 +0000)
committerBruce Momjian <bruce@momjian.us>
Wed, 22 Jan 1997 01:44:02 +0000 (01:44 +0000)
Invalidate vacuum relation cache to use new row counts from vacuum.

src/backend/commands/vacuum.c
src/backend/nodes/makefuncs.c
src/backend/optimizer/prep/preptlist.c
src/backend/parser/analyze.c
src/backend/parser/catalog_utils.c
src/backend/parser/parse_query.c
src/backend/parser/parser.c
src/include/nodes/makefuncs.h
src/include/nodes/primnodes.h
src/include/parser/catalog_utils.h

index 8fa7afd129564a60bf422efcd4230852514ee7be..396dd80c08a0cb59bf81cbfda38f01add8c7b3fc 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.14 1997/01/13 03:43:59 momjian Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.15 1997/01/22 01:42:16 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
 #include <catalog/pg_index.h>
 #include <catalog/index.h>
 #include <catalog/catname.h>
+#include <catalog/catalog.h>
 #include <catalog/pg_class.h>
 #include <catalog/pg_proc.h>
 #include <storage/smgr.h>
 #include <storage/lmgr.h>
+#include <utils/inval.h>
 #include <utils/mcxt.h>
 #include <utils/syscache.h>
 #include <commands/vacuum.h>
@@ -1430,6 +1432,11 @@ _vc_updstats(Oid relid, int npages, int ntuples, bool hasindex)
     /* XXX -- after write, should invalidate relcache in other backends */
     WriteNoReleaseBuffer(buf); /* heap_endscan release scan' buffers ? */
 
+    /* invalidating system relations confuses the function cache
+       of pg_operator and pg_opclass */
+    if ( !IsSystemRelationName(pgcform->relname.data))
+       RelationInvalidateHeapTuple(rd, tup);
+
     /* that's all, folks */
     heap_endscan(sdesc);
     heap_close(rd);
index a461524e7adf5972d444a89eb4d8b3c21e9feb13..18894e8a41c78810ae0c4672cf86bb10cc873b42 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/nodes/makefuncs.c,v 1.1.1.1 1996/07/09 06:21:32 scrappy Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/nodes/makefuncs.c,v 1.2 1997/01/22 01:42:26 momjian Exp $
  *
  * NOTES
  *    Creator functions in POSTGRES 4.2 are generated automatically. Most of
@@ -102,7 +102,8 @@ makeConst(Oid consttype,
          Datum constvalue,
          bool constisnull,
          bool constbyval,
-         bool constisset)
+         bool constisset,
+         bool constiscast)
 {
     Const *cnst = makeNode(Const);
 
@@ -112,6 +113,7 @@ makeConst(Oid consttype,
     cnst->constisnull = constisnull;
     cnst->constbyval = constbyval;
     cnst->constisset = constisset;
+    cnst->constiscast = constiscast;
     return cnst;
 }
 
index fe1c2c92ba26ac64d32b6a0ae8ad17f34d942498..d57755ac064720ec1314a3410048994d7caf939f 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/optimizer/prep/preptlist.c,v 1.1.1.1 1996/07/09 06:21:38 scrappy Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/optimizer/prep/preptlist.c,v 1.2 1997/01/22 01:42:38 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -279,7 +279,8 @@ new_relation_targetlist(Oid relid, Index rt_index, NodeTag node_type)
                                   (typedefault == (struct varlena *)NULL),
                                   /* XXX this is bullshit */
                                   false,
-                                  false /* not a set */);
+                                  false, /* not a set */
+                                  false);
                 
                temp3 = MakeTLE (makeResdom(attno,
                                            atttype,
index 29eb7d3cf981ae3f04d92f556fc9275ced4cff07..463cc06c8222a1bfac033a6af5b097bd0562c44a 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.19 1996/12/17 01:53:26 momjian Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.20 1997/01/22 01:42:54 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1288,7 +1288,8 @@ make_targetlist_expr(ParseState *pstate,
                                           val,
                                           false,
                                           true,
-                                          true /* is set */);
+                                          true, /* is set */
+                                          false);
               } else {
                    lnext(expr) = 
                         makeConst(attrtype, 
@@ -1297,7 +1298,8 @@ make_targetlist_expr(ParseState *pstate,
                                               val,get_typelem(attrtype),-1),
                                   false, 
                                   true /* Maybe correct-- 80% chance */,
-                                  false /* is not a set */);
+                                  false, /* is not a set */
+                                  false);
               }
          } else if((Typecast_ok) && (attrtype != type_id)){
               lnext(expr) = 
index 87ba88b315df2d862ef0eb7d67b1283d1395d572..e444742ef3e6a7833db7b7e8c22b7e88ee0feb10 100644 (file)
@@ -6,7 +6,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/parser/Attic/catalog_utils.c,v 1.14 1996/12/26 17:47:41 momjian Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/parser/Attic/catalog_utils.c,v 1.15 1997/01/22 01:43:08 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1405,6 +1405,26 @@ typeid_get_retinfunc(Oid type_id)
     return(infunc);
 }
 
+/* Given a type id, returns the out-conversion function of the type */
+Oid
+typeid_get_retoutfunc(Oid type_id)
+{
+    HeapTuple       typeTuple;
+    TypeTupleForm   type;
+    Oid             outfunc;
+    typeTuple = SearchSysCacheTuple(TYPOID,
+                                   ObjectIdGetDatum(type_id),
+                                   0,0,0);
+    if ( !HeapTupleIsValid ( typeTuple ))
+       elog(WARN,
+            "typeid_get_retoutfunc: Invalid type - oid = %u",
+            type_id);
+    
+    type = (TypeTupleForm) GETSTRUCT(typeTuple);
+    outfunc = type->typoutput;
+    return(outfunc);
+}
+
 Oid
 typeid_get_relid(Oid type_id)
 {
index d3fffc1b24b69a3b91f03a4a49f37bfc675c60fc..372f758a140df273ff202dec777c1eabd26c6d28 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/parser/Attic/parse_query.c,v 1.11 1996/12/07 04:38:10 momjian Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/parser/Attic/parse_query.c,v 1.12 1997/01/22 01:43:19 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -367,10 +367,50 @@ make_op(char *opname, Node *ltree, Node *rtree)
        left = NULL;
 
     }else {
-
+       char *outstr;
+       Oid infunc, outfunc;
+       Type newtype;
+
+#define CONVERTABLE_TYPE(t) (  (t) == INT2OID || \
+                               (t) == INT4OID || \
+                               (t) == OIDOID || \
+                               (t) == FLOAT4OID || \
+                               (t) == FLOAT8OID)
+       
        /* binary operator */
        ltypeId = (ltree==NULL) ? UNKNOWNOID : exprType(ltree);
        rtypeId = (rtree==NULL) ? UNKNOWNOID : exprType(rtree);
+
+       /* convert constant when using a const of a numeric type
+           and a non-const of another numeric type */
+       if (CONVERTABLE_TYPE(ltypeId) && nodeTag(ltree) != T_Const &&
+           CONVERTABLE_TYPE(rtypeId) && nodeTag(rtree) == T_Const &&
+          !((Const *)rtree)->constiscast) {
+          outfunc = typeid_get_retoutfunc(rtypeId);
+          infunc = typeid_get_retinfunc(ltypeId);
+          outstr = (char *)fmgr(outfunc, ((Const *)rtree)->constvalue);
+          ((Const *)rtree)->constvalue = (Datum)fmgr(infunc, outstr);
+          pfree(outstr);
+          ((Const *)rtree)->consttype = rtypeId = ltypeId;
+          newtype = get_id_type(rtypeId);
+          ((Const *)rtree)->constlen = tlen(newtype);
+          ((Const *)rtree)->constbyval = tbyval(newtype);
+       }
+
+       if (CONVERTABLE_TYPE(rtypeId) && nodeTag(rtree) != T_Const &&
+           CONVERTABLE_TYPE(ltypeId) && nodeTag(ltree) == T_Const &&
+          !((Const *)ltree)->constiscast) {
+          outfunc = typeid_get_retoutfunc(ltypeId);
+          infunc = typeid_get_retinfunc(rtypeId);
+          outstr = (char *)fmgr(outfunc, ((Const *)ltree)->constvalue);
+          ((Const *)ltree)->constvalue = (Datum)fmgr(infunc, outstr);
+          pfree(outstr);
+          ((Const *)ltree)->consttype = ltypeId = rtypeId;
+          newtype = get_id_type(ltypeId);
+          ((Const *)ltree)->constlen = tlen(newtype);
+          ((Const *)ltree)->constbyval = tbyval(newtype);
+       }
+
        temp = oper(opname, ltypeId, rtypeId);
        opform = (OperatorTupleForm) GETSTRUCT(temp);
        left = make_operand(opname, ltree, ltypeId, opform->oprleft);
@@ -654,7 +694,7 @@ make_const(Value *value)
                elog(NOTICE,"unknown type : %d\n", nodeTag(value));
 
            /* null const */
-           con = makeConst(0, 0, (Datum)NULL, TRUE, 0, FALSE);
+           con = makeConst(0, 0, (Datum)NULL, true, false, false, false);
            return con;
        }
     }
@@ -662,9 +702,10 @@ make_const(Value *value)
     con = makeConst(typeid(tp),
                    tlen(tp),
                    val,
-                   FALSE,
+                   false,
                    tbyval(tp),
-                   FALSE); /* not a set */
+                   false, /* not a set */
+                   false);
 
     return (con);
 }
index 0b04666c179f169ce78782d9a698a2e9ec25a686..1babdb7e03ff62ae085a97d273216f6e8e5c331d 100644 (file)
@@ -6,7 +6,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/parser/parser.c,v 1.16 1996/12/26 17:47:42 momjian Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/parser/parser.c,v 1.17 1997/01/22 01:43:26 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -283,9 +283,10 @@ parser_typecast(Value *expr, TypeName *typename, int typlen)
     adt = makeConst(typeid(tp),
                    len,
                    (Datum)lcp ,
-                   0,
+                   false,
                    tbyvalue(tp), 
-                   0 /* not a set */);
+                   false, /* not a set */
+                   true /* is cast */);
     
     if (string_palloced)
        pfree(const_string);
@@ -365,8 +366,9 @@ parser_typecast2(Node *expr, Oid exprType, Type tp, int typlen)
                        (Size) 0,
                        (Datum) NULL,
                        true,   /* isnull */
-                       0       /* was omitted */,
-                       0       /* not a set */);
+                       false,  /* was omitted */
+                       false,  /* not a set */
+                       true    /* is cast */);
        return ((Node*) adt);
     }
 
@@ -401,9 +403,10 @@ parser_typecast2(Node *expr, Oid exprType, Type tp, int typlen)
     adt = makeConst(typeid(tp),
                    (Size)len,
                    (Datum)lcp,
-                   0, 
-                   0 /*was omitted*/,
-                   0 /* not a set */);
+                   false, 
+                   false, /*was omitted*/
+                   false, /* not a set */
+                   true   /* is cast */);
     /*
       printf("adt %s : %u %d %d\n",CString(expr),typeid(tp) ,
       len,cp);
index 6bfec41bf8989b2c9dc8ebec37e93413fff235a9..a10182a33eeab9565c78093281096d5400d3f2a1 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: makefuncs.h,v 1.2 1996/11/06 09:21:42 scrappy Exp $
+ * $Id: makefuncs.h,v 1.3 1997/01/22 01:43:41 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -41,6 +41,7 @@ extern Const *makeConst(Oid consttype,
                        Datum constvalue,
                        bool constisnull,
                        bool constbyval,
-                       bool constisset);
+                       bool constisset,
+                       bool constiscast);
 
 #endif /* MAKEFUNC_H */
index 828a9d595abed1f1609f9be6413684d6cafb96af..cd30f229c9c33f6a48f986ef062eeaa85c0f4661 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: primnodes.h,v 1.6 1996/11/04 07:18:21 scrappy Exp $
+ * $Id: primnodes.h,v 1.7 1997/01/22 01:43:44 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -175,6 +175,7 @@ typedef struct Const {
     bool               constisnull;
     bool               constbyval;
     bool               constisset;
+    bool               constiscast;
 } Const;
 
 /* ----------------
index 5c7fe7f7531f9bb24b03b24ec18617d6ec66497f..df0d58ad18a323eacfbcbf48002ee8563d3180c5 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: catalog_utils.h,v 1.6 1996/12/11 03:18:12 bryanh Exp $
+ * $Id: catalog_utils.h,v 1.7 1997/01/22 01:44:02 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -46,6 +46,7 @@ extern Oid funcid_get_rettype(Oid funcid);
 extern bool func_get_detail(char *funcname, int nargs, Oid *oid_array,
            Oid *funcid, Oid *rettype, bool *retset, Oid **true_typeids);
 extern Oid typeid_get_retinfunc(Oid type_id);
+extern Oid typeid_get_retoutfunc(Oid type_id);
 extern Oid typeid_get_relid(Oid type_id);
 extern Oid get_typrelid(Type typ);
 extern Oid get_typelem(Oid type_id);