diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2000-11-16 22:30:52 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2000-11-16 22:30:52 +0000 |
commit | a933ee38bbb8dffbc48a3363a94ff6f2a9f7964d (patch) | |
tree | 1c32737389b2530e7152dc2287161b36d9001e8c /src/backend/optimizer/util/clauses.c | |
parent | cff23842a4c68301ddf34559c7af383bb5557054 (diff) | |
download | postgresql-a933ee38bbb8dffbc48a3363a94ff6f2a9f7964d.tar.gz postgresql-a933ee38bbb8dffbc48a3363a94ff6f2a9f7964d.zip |
Change SearchSysCache coding conventions so that a reference count is
maintained for each cache entry. A cache entry will not be freed until
the matching ReleaseSysCache call has been executed. This eliminates
worries about cache entries getting dropped while still in use. See
my posting to pg-hackers of even date for more info.
Diffstat (limited to 'src/backend/optimizer/util/clauses.c')
-rw-r--r-- | src/backend/optimizer/util/clauses.c | 56 |
1 files changed, 30 insertions, 26 deletions
diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c index f52ec6d2d87..c8df8b26fe4 100644 --- a/src/backend/optimizer/util/clauses.c +++ b/src/backend/optimizer/util/clauses.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.77 2000/10/05 19:11:32 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.78 2000/11/16 22:30:26 tgl Exp $ * * HISTORY * AUTHOR DATE MAJOR EVENT @@ -28,7 +28,6 @@ #include "optimizer/clauses.h" #include "optimizer/tlist.h" #include "optimizer/var.h" -#include "parser/parse_type.h" #include "parser/parsetree.h" #include "utils/datum.h" #include "utils/lsyscache.h" @@ -995,7 +994,8 @@ get_rels_atts(Node *clause, void CommuteClause(Expr *clause) { - HeapTuple heapTup; + Oid opoid; + HeapTuple optup; Form_pg_operator commuTup; Oper *commu; Node *temp; @@ -1004,19 +1004,22 @@ CommuteClause(Expr *clause) length(clause->args) != 2) elog(ERROR, "CommuteClause: applied to non-binary-operator clause"); - heapTup = (HeapTuple) - get_operator_tuple(get_commutator(((Oper *) clause->oper)->opno)); + opoid = ((Oper *) clause->oper)->opno; - if (heapTup == (HeapTuple) NULL) - elog(ERROR, "CommuteClause: no commutator for operator %u", - ((Oper *) clause->oper)->opno); + optup = SearchSysCache(OPEROID, + ObjectIdGetDatum(get_commutator(opoid)), + 0, 0, 0); + if (!HeapTupleIsValid(optup)) + elog(ERROR, "CommuteClause: no commutator for operator %u", opoid); - commuTup = (Form_pg_operator) GETSTRUCT(heapTup); + commuTup = (Form_pg_operator) GETSTRUCT(optup); - commu = makeOper(heapTup->t_data->t_oid, + commu = makeOper(optup->t_data->t_oid, commuTup->oprcode, commuTup->oprresult); + ReleaseSysCache(optup); + /* * re-form the clause in-place! */ @@ -1434,9 +1437,11 @@ simplify_op_or_func(Expr *expr, List *args) Oid result_typeid; HeapTuple func_tuple; Form_pg_proc funcform; - Type resultType; + bool proiscachable; + bool proisstrict; + bool proretset; + int16 resultTypLen; bool resultTypByVal; - int resultTypLen; Expr *newexpr; ExprContext *econtext; Datum const_val; @@ -1491,36 +1496,37 @@ simplify_op_or_func(Expr *expr, List *args) * we could use func_iscachable() here, but we need several fields * out of the func tuple, so might as well just look it up once. */ - func_tuple = SearchSysCacheTuple(PROCOID, - ObjectIdGetDatum(funcid), - 0, 0, 0); + func_tuple = SearchSysCache(PROCOID, + ObjectIdGetDatum(funcid), + 0, 0, 0); if (!HeapTupleIsValid(func_tuple)) elog(ERROR, "Function OID %u does not exist", funcid); funcform = (Form_pg_proc) GETSTRUCT(func_tuple); - if (!funcform->proiscachable) + proiscachable = funcform->proiscachable; + proisstrict = funcform->proisstrict; + proretset = funcform->proretset; + ReleaseSysCache(func_tuple); + + if (!proiscachable) return NULL; /* * Also check to make sure it doesn't return a set. */ - if (funcform->proretset) + if (proretset) return NULL; /* * Now that we know if the function is strict, we can finish the * checks for simplifiable inputs that we started above. */ - if (funcform->proisstrict && has_null_input) + if (proisstrict && has_null_input) { /* * It's strict and has NULL input, so must produce NULL output. * Return a NULL constant of the right type. */ - resultType = typeidType(result_typeid); - return (Expr *) makeConst(result_typeid, typeLen(resultType), - (Datum) 0, true, - typeByVal(resultType), - false, false); + return (Expr *) makeNullConst(result_typeid); } /* @@ -1548,9 +1554,7 @@ simplify_op_or_func(Expr *expr, List *args) newexpr->args = args; /* Get info needed about result datatype */ - resultType = typeidType(result_typeid); - resultTypByVal = typeByVal(resultType); - resultTypLen = typeLen(resultType); + get_typlenbyval(result_typeid, &resultTypLen, &resultTypByVal); /* * It is OK to pass a dummy econtext because none of the ExecEvalExpr() |