mirror of
https://github.com/postgres/postgres.git
synced 2025-05-11 05:41:32 +03:00
Fix for indexing problem (?): heap tuple was pfree-d before CatalogIndexInsert()...
This commit is contained in:
parent
b5ed4be218
commit
04abb54197
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.61 1998/09/07 05:35:37 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.62 1998/09/09 03:42:52 vadim Exp $
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* INTERFACE ROUTINES
|
* INTERFACE ROUTINES
|
||||||
@ -64,7 +64,8 @@
|
|||||||
#define NTUPLES_PER_PAGE(natts) (BLCKSZ/((natts)*AVG_TUPLE_SIZE))
|
#define NTUPLES_PER_PAGE(natts) (BLCKSZ/((natts)*AVG_TUPLE_SIZE))
|
||||||
|
|
||||||
/* non-export function prototypes */
|
/* non-export function prototypes */
|
||||||
static Oid RelationNameGetObjectId(char *relationName, Relation pg_class);
|
static Oid
|
||||||
|
RelationNameGetObjectId(char *relationName, Relation pg_class);
|
||||||
static Oid GetHeapRelationOid(char *heapRelationName, char *indexRelationName);
|
static Oid GetHeapRelationOid(char *heapRelationName, char *indexRelationName);
|
||||||
static TupleDesc BuildFuncTupleDesc(FuncIndexInfo *funcInfo);
|
static TupleDesc BuildFuncTupleDesc(FuncIndexInfo *funcInfo);
|
||||||
static TupleDesc ConstructTupleDescriptor(Oid heapoid, Relation heapRelation,
|
static TupleDesc ConstructTupleDescriptor(Oid heapoid, Relation heapRelation,
|
||||||
@ -72,11 +73,12 @@ static TupleDesc ConstructTupleDescriptor(Oid heapoid, Relation heapRelation,
|
|||||||
int numatts, AttrNumber *attNums);
|
int numatts, AttrNumber *attNums);
|
||||||
|
|
||||||
static void ConstructIndexReldesc(Relation indexRelation, Oid amoid);
|
static void ConstructIndexReldesc(Relation indexRelation, Oid amoid);
|
||||||
static Oid UpdateRelationRelation(Relation indexRelation);
|
static Oid UpdateRelationRelation(Relation indexRelation);
|
||||||
static void InitializeAttributeOids(Relation indexRelation,
|
static void InitializeAttributeOids(Relation indexRelation,
|
||||||
int numatts,
|
int numatts,
|
||||||
Oid indexoid);
|
Oid indexoid);
|
||||||
static void AppendAttributeTuples(Relation indexRelation, int numatts);
|
static void
|
||||||
|
AppendAttributeTuples(Relation indexRelation, int numatts);
|
||||||
static void UpdateIndexRelation(Oid indexoid, Oid heapoid,
|
static void UpdateIndexRelation(Oid indexoid, Oid heapoid,
|
||||||
FuncIndexInfo *funcInfo, int natts,
|
FuncIndexInfo *funcInfo, int natts,
|
||||||
AttrNumber *attNums, Oid *classOids, Node *predicate,
|
AttrNumber *attNums, Oid *classOids, Node *predicate,
|
||||||
@ -550,9 +552,11 @@ UpdateRelationRelation(Relation indexRelation)
|
|||||||
sizeof(*indexRelation->rd_rel),
|
sizeof(*indexRelation->rd_rel),
|
||||||
(char *) indexRelation->rd_rel);
|
(char *) indexRelation->rd_rel);
|
||||||
|
|
||||||
/*
|
/* ----------------
|
||||||
* The new tuple must have the same oid as the heap_create() we just
|
* the new tuple must have the same oid as the relcache entry for the
|
||||||
* did.
|
* index. sure would be embarassing to do this sort of thing in polite
|
||||||
|
* company.
|
||||||
|
* ----------------
|
||||||
*/
|
*/
|
||||||
tuple->t_oid = RelationGetRelid(indexRelation);
|
tuple->t_oid = RelationGetRelid(indexRelation);
|
||||||
heap_insert(pg_class, tuple);
|
heap_insert(pg_class, tuple);
|
||||||
@ -1074,7 +1078,7 @@ index_create(char *heapRelationName,
|
|||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
* add index to catalogs
|
* add index to catalogs
|
||||||
* (INSERT pg_class tuple)
|
* (append RELATION tuple)
|
||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
indexoid = UpdateRelationRelation(indexRelation);
|
indexoid = UpdateRelationRelation(indexRelation);
|
||||||
@ -1260,7 +1264,8 @@ FormIndexDatum(int numberOfAttributes,
|
|||||||
char *nullv,
|
char *nullv,
|
||||||
FuncIndexInfoPtr fInfo)
|
FuncIndexInfoPtr fInfo)
|
||||||
{
|
{
|
||||||
AttrNumber attOff;
|
AttrNumber i;
|
||||||
|
int offset;
|
||||||
bool isNull;
|
bool isNull;
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
@ -1270,16 +1275,18 @@ FormIndexDatum(int numberOfAttributes,
|
|||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for (attOff = 0; attOff < numberOfAttributes; attOff++)
|
for (i = 1; i <= numberOfAttributes; i++)
|
||||||
{
|
{
|
||||||
datum[attOff] = PointerGetDatum(GetIndexValue(heapTuple,
|
offset = AttrNumberGetAttrOffset(i);
|
||||||
|
|
||||||
|
datum[offset] = PointerGetDatum(GetIndexValue(heapTuple,
|
||||||
heapDescriptor,
|
heapDescriptor,
|
||||||
attOff,
|
offset,
|
||||||
attributeNumber,
|
attributeNumber,
|
||||||
fInfo,
|
fInfo,
|
||||||
&isNull));
|
&isNull));
|
||||||
|
|
||||||
nullv[attOff] = (isNull) ? 'n' : ' ';
|
nullv[offset] = (isNull) ? 'n' : ' ';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1417,10 +1424,10 @@ UpdateStats(Oid relid, long reltuples, bool hasindex)
|
|||||||
|
|
||||||
newtup = heap_modifytuple(tuple, pg_class, values, nulls, replace);
|
newtup = heap_modifytuple(tuple, pg_class, values, nulls, replace);
|
||||||
heap_replace(pg_class, &tuple->t_ctid, newtup);
|
heap_replace(pg_class, &tuple->t_ctid, newtup);
|
||||||
pfree(newtup);
|
|
||||||
CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, idescs);
|
CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, idescs);
|
||||||
CatalogIndexInsert(idescs, Num_pg_class_indices, pg_class, newtup);
|
CatalogIndexInsert(idescs, Num_pg_class_indices, pg_class, newtup);
|
||||||
CatalogCloseIndices(Num_pg_class_indices, idescs);
|
CatalogCloseIndices(Num_pg_class_indices, idescs);
|
||||||
|
pfree(newtup);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!IsBootstrapProcessingMode())
|
if (!IsBootstrapProcessingMode())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user