From 475493130de825caf884d537d193d6b3ff8d0279 Mon Sep 17 00:00:00 2001 From: "Marc G. Fournier" Date: Mon, 16 Sep 1996 05:33:20 +0000 Subject: [PATCH] |Subject: Postgres patch: Assert attribute type match | |Here's a patch for Version 2 only. It just adds an Assert to catch some |inconsistencies in the catalog classes. | |-- |Bryan Henderson Phone 408-227-6803 |San Jose, California | --- src/backend/executor/execQual.c | 28 ++++++++++++++++++++++++---- src/include/access/tupdesc.h | 21 ++++++++------------- 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/src/backend/executor/execQual.c b/src/backend/executor/execQual.c index 104c1f2f506..fe2744d1e20 100644 --- a/src/backend/executor/execQual.c +++ b/src/backend/executor/execQual.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/execQual.c,v 1.1.1.1 1996/07/09 06:21:25 scrappy Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/execQual.c,v 1.2 1996/09/16 05:33:20 scrappy Exp $ * *------------------------------------------------------------------------- */ @@ -172,8 +172,24 @@ ExecEvalAggreg(Aggreg *agg, ExprContext *econtext, bool *isNull) * * Returns a Datum whose value is the value of a range * variable with respect to given expression context. - * ---------------------------------------------------------------- - */ + * + * + * As an entry condition, we expect that the the datatype the + * plan expects to get (as told by our "variable" argument) is in + * fact the datatype of the attribute the plan says to fetch (as + * seen in the current context, identified by our "econtext" + * argument). + * + * If we fetch a Type A attribute and Caller treats it as if it + * were Type B, there will be undefined results (e.g. crash). + * One way these might mismatch now is that we're accessing a + * catalog class and the type information in the pg_attribute + * class does not match the hardcoded pg_attribute information + * (in pg_attribute.h) for the class in question. + * + * We have an Assert to make sure this entry condition is met. + * + * ---------------------------------------------------------------- */ Datum ExecEvalVar(Var *variable, ExprContext *econtext, bool *isNull) { @@ -211,8 +227,12 @@ ExecEvalVar(Var *variable, ExprContext *econtext, bool *isNull) heapTuple = slot->val; tuple_type = slot->ttc_tupleDescriptor; buffer = slot->ttc_buffer; - + attnum = variable->varattno; + + /* (See prolog for explanation of this Assert) */ + Assert(attnum < 0 || + variable->vartype == tuple_type->attrs[attnum-1]->atttypid) /* * If the attribute number is invalid, then we are supposed to diff --git a/src/include/access/tupdesc.h b/src/include/access/tupdesc.h index 75945b625d6..b6cb6f447e7 100644 --- a/src/include/access/tupdesc.h +++ b/src/include/access/tupdesc.h @@ -6,7 +6,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: tupdesc.h,v 1.1 1996/08/27 21:50:26 scrappy Exp $ + * $Id: tupdesc.h,v 1.2 1996/09/16 05:33:13 scrappy Exp $ * *------------------------------------------------------------------------- */ @@ -18,21 +18,16 @@ #include "nodes/pg_list.h" /* for List */ #include "catalog/pg_attribute.h" -/* - * a TupleDesc is an array of AttributeTupleForms, each of which is a - * pointer to a AttributeTupleForm - */ -/* typedef AttributeTupleForm *TupleDesc; */ - -/* a TupleDesc is a pointer to a structure which includes an array of */ -/* AttributeTupleForms, i.e. pg_attribute information, and the size of */ -/* the array, i.e. the number of attributes */ -/* in short, a TupleDesc completely captures the attribute information */ -/* for a tuple */ typedef struct tupleDesc { - int natts; +/*------------------------------------------------------------------------ + This structure contains all the attribute information (i.e. from Class + pg_attribute) for a tuple. +-------------------------------------------------------------------------*/ + int natts; + /* Number of attributes in the tuple */ AttributeTupleForm *attrs; + /* attrs[N] is a pointer to the description of Attribute Number N+1. */ } *TupleDesc; extern TupleDesc CreateTemplateTupleDesc(int natts);