Commit a2740a45 authored by Marc G. Fournier's avatar Marc G. Fournier

There, now we support GiST...now what? :)

parent fe87dbb1
...@@ -7,18 +7,19 @@ ...@@ -7,18 +7,19 @@
# #
# #
# IDENTIFICATION # IDENTIFICATION
# $Header: /cvsroot/pgsql/src/backend/access/Attic/Makefile.inc,v 1.1.1.1 1996/07/09 06:21:08 scrappy Exp $ # $Header: /cvsroot/pgsql/src/backend/access/Attic/Makefile.inc,v 1.2 1996/08/26 06:26:37 scrappy Exp $
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
accdir=$(CURDIR)/access accdir=$(CURDIR)/access
VPATH:=$(VPATH):$(accdir):\ VPATH:=$(VPATH):$(accdir):\
$(accdir)/common:$(accdir)/hash:$(accdir)/heap:$(accdir)/index:\ $(accdir)/common:$(accdir)/gist:$(accdir)/hash:$(accdir)/heap:\
$(accdir)/rtree:$(accdir)/nbtree:$(accdir)/transam $(accdir)/index:$(accdir)/rtree:$(accdir)/nbtree:$(accdir)/transam
SUBSRCS= SUBSRCS=
include $(accdir)/common/Makefile.inc include $(accdir)/common/Makefile.inc
include $(accdir)/gist/Makefile.inc
include $(accdir)/hash/Makefile.inc include $(accdir)/hash/Makefile.inc
include $(accdir)/heap/Makefile.inc include $(accdir)/heap/Makefile.inc
include $(accdir)/index/Makefile.inc include $(accdir)/index/Makefile.inc
...@@ -27,7 +28,7 @@ include $(accdir)/nbtree/Makefile.inc ...@@ -27,7 +28,7 @@ include $(accdir)/nbtree/Makefile.inc
include $(accdir)/transam/Makefile.inc include $(accdir)/transam/Makefile.inc
SRCS_ACCESS:= $(SUBSRCS) SRCS_ACCESS:= $(SUBSRCS)
HEADERS+= attnum.h funcindex.h genam.h hash.h \ HEADERS+= attnum.h funcindex.h genam.h gist.h hash.h \
heapam.h hio.h htup.h ibit.h iqual.h istrat.h \ heapam.h hio.h htup.h ibit.h iqual.h istrat.h \
itup.h nbtree.h printtup.h relscan.h rtree.h \ itup.h nbtree.h printtup.h relscan.h rtree.h \
sdir.h skey.h strat.h transam.h tupdesc.h tupmacs.h \ sdir.h skey.h strat.h transam.h tupdesc.h tupmacs.h \
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: genam.h,v 1.1.1.1 1996/07/09 06:21:08 scrappy Exp $ * $Id: genam.h,v 1.2 1996/08/26 06:26:40 scrappy Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -32,7 +32,8 @@ extern Relation index_open(Oid relationId); ...@@ -32,7 +32,8 @@ extern Relation index_open(Oid relationId);
extern Relation index_openr(char *relationName); extern Relation index_openr(char *relationName);
extern void index_close(Relation relation); extern void index_close(Relation relation);
extern InsertIndexResult index_insert(Relation relation, extern InsertIndexResult index_insert(Relation relation,
IndexTuple indexTuple); Datum *datum, char *nulls,
ItemPointer heap_t_ctid);
extern void index_delete(Relation relation, ItemPointer indexItem); extern void index_delete(Relation relation, ItemPointer indexItem);
extern IndexScanDesc index_beginscan(Relation relation, bool scanFromEnd, extern IndexScanDesc index_beginscan(Relation relation, bool scanFromEnd,
uint16 numberOfKeys, ScanKey key); uint16 numberOfKeys, ScanKey key);
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: hash.h,v 1.1.1.1 1996/07/09 06:21:08 scrappy Exp $ * $Id: hash.h,v 1.2 1996/08/26 06:26:42 scrappy Exp $
* *
* NOTES * NOTES
* modeled after Margo Seltzer's hash implementation for unix. * modeled after Margo Seltzer's hash implementation for unix.
...@@ -250,7 +250,8 @@ typedef HashItemData *HashItem; ...@@ -250,7 +250,8 @@ typedef HashItemData *HashItem;
extern void hashbuild(Relation heap, Relation index, int natts, extern void hashbuild(Relation heap, Relation index, int natts,
AttrNumber *attnum, IndexStrategy istrat, uint16 pcount, AttrNumber *attnum, IndexStrategy istrat, uint16 pcount,
Datum *params, FuncIndexInfo *finfo, PredInfo *predInfo); Datum *params, FuncIndexInfo *finfo, PredInfo *predInfo);
extern InsertIndexResult hashinsert(Relation rel, IndexTuple itup); extern InsertIndexResult hashinsert(Relation rel, Datum *datum, char *nulls,
ItemPointer ht_ctid);
extern char *hashgettuple(IndexScanDesc scan, ScanDirection dir); extern char *hashgettuple(IndexScanDesc scan, ScanDirection dir);
extern char *hashbeginscan(Relation rel, bool fromEnd, uint16 keysz, extern char *hashbeginscan(Relation rel, bool fromEnd, uint16 keysz,
ScanKey scankey); ScanKey scankey);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/access/hash/hash.c,v 1.1.1.1 1996/07/09 06:21:10 scrappy Exp $ * $Header: /cvsroot/pgsql/src/backend/access/hash/hash.c,v 1.2 1996/08/26 06:27:28 scrappy Exp $
* *
* NOTES * NOTES
* This file contains only the public interface routines. * This file contains only the public interface routines.
...@@ -252,11 +252,17 @@ hashbuild(Relation heap, ...@@ -252,11 +252,17 @@ hashbuild(Relation heap,
* to the caller. * to the caller.
*/ */
InsertIndexResult InsertIndexResult
hashinsert(Relation rel, IndexTuple itup) hashinsert(Relation rel, Datum *datum, char *nulls, ItemPointer ht_ctid)
{ {
HashItem hitem; HashItem hitem;
IndexTuple itup;
InsertIndexResult res; InsertIndexResult res;
/* generate an index tuple */
itup = index_formtuple(RelationGetTupleDescriptor(rel), datum, nulls);
itup->t_tid = *ht_ctid;
if (itup->t_info & INDEX_NULL_MASK) if (itup->t_info & INDEX_NULL_MASK)
return ((InsertIndexResult) NULL); return ((InsertIndexResult) NULL);
...@@ -265,6 +271,7 @@ hashinsert(Relation rel, IndexTuple itup) ...@@ -265,6 +271,7 @@ hashinsert(Relation rel, IndexTuple itup)
res = _hash_doinsert(rel, hitem); res = _hash_doinsert(rel, hitem);
pfree(hitem); pfree(hitem);
pfree(itup);
return (res); return (res);
} }
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/access/index/indexam.c,v 1.1.1.1 1996/07/09 06:21:11 scrappy Exp $ * $Header: /cvsroot/pgsql/src/backend/access/index/indexam.c,v 1.2 1996/08/26 06:27:48 scrappy Exp $
* *
* INTERFACE ROUTINES * INTERFACE ROUTINES
* index_open - open an index relation by relationId * index_open - open an index relation by relationId
...@@ -179,7 +179,9 @@ index_close(Relation relation) ...@@ -179,7 +179,9 @@ index_close(Relation relation)
*/ */
InsertIndexResult InsertIndexResult
index_insert(Relation relation, index_insert(Relation relation,
IndexTuple indexTuple) Datum *datum,
char *nulls,
ItemPointer heap_t_ctid)
{ {
RegProcedure procedure; RegProcedure procedure;
InsertIndexResult specificResult; InsertIndexResult specificResult;
...@@ -192,7 +194,7 @@ index_insert(Relation relation, ...@@ -192,7 +194,7 @@ index_insert(Relation relation,
* ---------------- * ----------------
*/ */
specificResult = (InsertIndexResult) specificResult = (InsertIndexResult)
fmgr(procedure, relation, indexTuple, NULL); fmgr(procedure, relation, datum, nulls, heap_t_ctid, NULL);
/* ---------------- /* ----------------
* the insert proc is supposed to return a "specific result" and * the insert proc is supposed to return a "specific result" and
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: nbtree.h,v 1.2 1996/07/30 07:55:10 scrappy Exp $ * $Id: nbtree.h,v 1.3 1996/08/26 06:26:44 scrappy Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -201,7 +201,8 @@ extern bool BuildingBtree; /* in nbtree.c */ ...@@ -201,7 +201,8 @@ extern bool BuildingBtree; /* in nbtree.c */
extern void btbuild(Relation heap, Relation index, int natts, extern void btbuild(Relation heap, Relation index, int natts,
AttrNumber *attnum, IndexStrategy istrat, uint16 pcount, AttrNumber *attnum, IndexStrategy istrat, uint16 pcount,
Datum *params, FuncIndexInfo *finfo, PredInfo *predInfo); Datum *params, FuncIndexInfo *finfo, PredInfo *predInfo);
extern InsertIndexResult btinsert(Relation rel, IndexTuple itup); extern InsertIndexResult btinsert(Relation rel, Datum *datum, char *nulls,
ItemPointer ht_ctid);
extern char *btgettuple(IndexScanDesc scan, ScanDirection dir); extern char *btgettuple(IndexScanDesc scan, ScanDirection dir);
extern char *btbeginscan(Relation rel, bool fromEnd, uint16 keysz, extern char *btbeginscan(Relation rel, bool fromEnd, uint16 keysz,
ScanKey scankey); ScanKey scankey);
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtree.c,v 1.2 1996/07/30 07:56:00 scrappy Exp $ * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtree.c,v 1.3 1996/08/26 06:28:21 scrappy Exp $
* *
* NOTES * NOTES
* This file contains only the public interface routines. * This file contains only the public interface routines.
...@@ -285,11 +285,16 @@ btbuild(Relation heap, ...@@ -285,11 +285,16 @@ btbuild(Relation heap,
* return an InsertIndexResult to the caller. * return an InsertIndexResult to the caller.
*/ */
InsertIndexResult InsertIndexResult
btinsert(Relation rel, IndexTuple itup) btinsert(Relation rel, Datum *datum, char *nulls, ItemPointer ht_ctid)
{ {
BTItem btitem; BTItem btitem;
IndexTuple itup;
InsertIndexResult res; InsertIndexResult res;
/* generate an index tuple */
itup = index_formtuple(RelationGetTupleDescriptor(rel), datum, nulls);
itup->t_tid = *ht_ctid;
if (itup->t_info & INDEX_NULL_MASK) if (itup->t_info & INDEX_NULL_MASK)
return ((InsertIndexResult) NULL); return ((InsertIndexResult) NULL);
...@@ -297,6 +302,7 @@ btinsert(Relation rel, IndexTuple itup) ...@@ -297,6 +302,7 @@ btinsert(Relation rel, IndexTuple itup)
res = _bt_doinsert(rel, btitem); res = _bt_doinsert(rel, btitem);
pfree(btitem); pfree(btitem);
pfree(itup);
return (res); return (res);
} }
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/access/rtree/Attic/rtree.c,v 1.1.1.1 1996/07/09 06:21:13 scrappy Exp $ * $Header: /cvsroot/pgsql/src/backend/access/rtree/Attic/rtree.c,v 1.2 1996/08/26 06:29:10 scrappy Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -273,11 +273,15 @@ rtbuild(Relation heap, ...@@ -273,11 +273,15 @@ rtbuild(Relation heap,
* It doesn't do any work; just locks the relation and passes the buck. * It doesn't do any work; just locks the relation and passes the buck.
*/ */
InsertIndexResult InsertIndexResult
rtinsert(Relation r, IndexTuple itup) rtinsert(Relation r, Datum *datum, char *nulls, ItemPointer ht_ctid)
{ {
InsertIndexResult res; InsertIndexResult res;
IndexTuple itup;
RTSTATE rtState; RTSTATE rtState;
/* generate an index tuple */
itup = index_formtuple(RelationGetTupleDescriptor(r), datum, nulls);
itup->t_tid = *ht_ctid;
initRtstate(&rtState, r); initRtstate(&rtState, r);
RelationSetLockForWrite(r); RelationSetLockForWrite(r);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.2 1996/08/19 13:32:07 scrappy Exp $ * $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.3 1996/08/26 06:29:32 scrappy Exp $
* *
* *
* INTERFACE ROUTINES * INTERFACE ROUTINES
...@@ -86,6 +86,7 @@ static Oid RelationNameGetObjectId(char *relationName, Relation pg_class, ...@@ -86,6 +86,7 @@ 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,
TypeName *IndexKeyType,
int numatts, AttrNumber attNums[]); int numatts, AttrNumber attNums[]);
static void ConstructIndexReldesc(Relation indexRelation, Oid amoid); static void ConstructIndexReldesc(Relation indexRelation, Oid amoid);
...@@ -97,7 +98,8 @@ static void ...@@ -97,7 +98,8 @@ static void
AppendAttributeTuples(Relation indexRelation, int numatts); 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,
TypeName *indexKeyType, bool islossy);
static void DefaultBuild(Relation heapRelation, Relation indexRelation, static void DefaultBuild(Relation heapRelation, Relation indexRelation,
int numberOfAttributes, AttrNumber attributeNumber[], int numberOfAttributes, AttrNumber attributeNumber[],
IndexStrategy indexStrategy, uint16 parameterCount, IndexStrategy indexStrategy, uint16 parameterCount,
...@@ -341,6 +343,7 @@ BuildFuncTupleDesc(FuncIndexInfo *funcInfo) ...@@ -341,6 +343,7 @@ BuildFuncTupleDesc(FuncIndexInfo *funcInfo)
static TupleDesc static TupleDesc
ConstructTupleDescriptor(Oid heapoid, ConstructTupleDescriptor(Oid heapoid,
Relation heapRelation, Relation heapRelation,
TypeName *IndexKeyType,
int numatts, int numatts,
AttrNumber attNums[]) AttrNumber attNums[])
{ {
...@@ -424,7 +427,28 @@ ConstructTupleDescriptor(Oid heapoid, ...@@ -424,7 +427,28 @@ ConstructTupleDescriptor(Oid heapoid,
to = (char *) (indexTupDesc->attrs[ i ]); to = (char *) (indexTupDesc->attrs[ i ]);
memcpy(to, from, ATTRIBUTE_TUPLE_SIZE); memcpy(to, from, ATTRIBUTE_TUPLE_SIZE);
/* if the keytype is defined, we need to change the tuple form's
atttypid & attlen field to match that of the key's type */
if (IndexKeyType != NULL) {
HeapTuple tup;
tup = SearchSysCacheTuple(TYPNAME,
PointerGetDatum(IndexKeyType->name),
0,0,0);
if(!HeapTupleIsValid(tup))
elog(WARN, "create index: type '%s' undefined",
IndexKeyType->name);
((AttributeTupleForm) to)->atttypid = tup->t_oid;
((AttributeTupleForm) to)->attbyval =
((TypeTupleForm) ((char *)tup + tup->t_hoff))->typbyval;
if (IndexKeyType->typlen > 0)
((AttributeTupleForm) to)->attlen = IndexKeyType->typlen;
else ((AttributeTupleForm) to)->attlen =
((TypeTupleForm) ((char *)tup + tup->t_hoff))->typlen;
}
/* ---------------- /* ----------------
* now we have to drop in the proper relation descriptor * now we have to drop in the proper relation descriptor
* into the copied tuple form's attrelid and we should be * into the copied tuple form's attrelid and we should be
...@@ -734,7 +758,9 @@ UpdateIndexRelation(Oid indexoid, ...@@ -734,7 +758,9 @@ UpdateIndexRelation(Oid indexoid,
int natts, int natts,
AttrNumber attNums[], AttrNumber attNums[],
Oid classOids[], Oid classOids[],
Node *predicate) Node *predicate,
TypeName *indexKeyType,
bool islossy)
{ {
IndexTupleForm indexForm; IndexTupleForm indexForm;
char *predString; char *predString;
...@@ -770,6 +796,11 @@ UpdateIndexRelation(Oid indexoid, ...@@ -770,6 +796,11 @@ UpdateIndexRelation(Oid indexoid,
indexForm->indexrelid = indexoid; indexForm->indexrelid = indexoid;
indexForm->indproc = (PointerIsValid(funcInfo)) ? indexForm->indproc = (PointerIsValid(funcInfo)) ?
FIgetProcOid(funcInfo) : InvalidOid; FIgetProcOid(funcInfo) : InvalidOid;
indexForm->indislossy = islossy;
if (indexKeyType != NULL)
indexForm->indhaskeytype = 1;
else
indexForm->indhaskeytype = 0;
memset((char *)& indexForm->indkey[0], 0, sizeof indexForm->indkey); memset((char *)& indexForm->indkey[0], 0, sizeof indexForm->indkey);
memset((char *)& indexForm->indclass[0], 0, sizeof indexForm->indclass); memset((char *)& indexForm->indclass[0], 0, sizeof indexForm->indclass);
...@@ -987,13 +1018,15 @@ void ...@@ -987,13 +1018,15 @@ void
index_create(char *heapRelationName, index_create(char *heapRelationName,
char *indexRelationName, char *indexRelationName,
FuncIndexInfo *funcInfo, FuncIndexInfo *funcInfo,
TypeName *IndexKeyType,
Oid accessMethodObjectId, Oid accessMethodObjectId,
int numatts, int numatts,
AttrNumber attNums[], AttrNumber attNums[],
Oid classObjectId[], Oid classObjectId[],
uint16 parameterCount, uint16 parameterCount,
Datum *parameter, Datum *parameter,
Node *predicate) Node *predicate,
bool islossy)
{ {
Relation heapRelation; Relation heapRelation;
Relation indexRelation; Relation indexRelation;
...@@ -1034,6 +1067,7 @@ index_create(char *heapRelationName, ...@@ -1034,6 +1067,7 @@ index_create(char *heapRelationName,
else else
indexTupDesc = ConstructTupleDescriptor(heapoid, indexTupDesc = ConstructTupleDescriptor(heapoid,
heapRelation, heapRelation,
IndexKeyType,
numatts, numatts,
attNums); attNums);
...@@ -1105,7 +1139,8 @@ index_create(char *heapRelationName, ...@@ -1105,7 +1139,8 @@ index_create(char *heapRelationName,
* ---------------- * ----------------
*/ */
UpdateIndexRelation(indexoid, heapoid, funcInfo, UpdateIndexRelation(indexoid, heapoid, funcInfo,
numatts, attNums, classObjectId, predicate); numatts, attNums, classObjectId, predicate,
IndexKeyType, islossy);
predInfo = (PredInfo*)palloc(sizeof(PredInfo)); predInfo = (PredInfo*)palloc(sizeof(PredInfo));
predInfo->pred = predicate; predInfo->pred = predicate;
...@@ -1568,7 +1603,8 @@ DefaultBuild(Relation heapRelation, ...@@ -1568,7 +1603,8 @@ DefaultBuild(Relation heapRelation,
indexTuple->t_tid = heapTuple->t_ctid; indexTuple->t_tid = heapTuple->t_ctid;
insertResult = index_insert(indexRelation, indexTuple); insertResult = index_insert(indexRelation, datum, nullv,
&(heapTuple->t_ctid));
if (insertResult) pfree(insertResult); if (insertResult) pfree(insertResult);
pfree(indexTuple); pfree(indexTuple);
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: index.h,v 1.2 1996/08/19 13:32:08 scrappy Exp $ * $Id: index.h,v 1.3 1996/08/26 06:29:36 scrappy Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include "access/funcindex.h" #include "access/funcindex.h"
#include "access/itup.h" #include "access/itup.h"
#include "nodes/execnodes.h" #include "nodes/execnodes.h"
#include "nodes/parsenodes.h"
extern Form_pg_am extern Form_pg_am
...@@ -31,13 +32,15 @@ extern void InitIndexStrategy(int numatts, ...@@ -31,13 +32,15 @@ extern void InitIndexStrategy(int numatts,
extern void index_create(char *heapRelationName, extern void index_create(char *heapRelationName,
char* indexRelationName, char* indexRelationName,
FuncIndexInfo *funcInfo, FuncIndexInfo *funcInfo,
TypeName *IndexKeyType,
Oid accessMethodObjectId, Oid accessMethodObjectId,
int numatts, int numatts,
AttrNumber attNums[], AttrNumber attNums[],
Oid classObjectId[], Oid classObjectId[],
uint16 parameterCount, uint16 parameterCount,
Datum *parameter, Datum *parameter,
Node *predicate); Node *predicate,
bool islossy);
extern void index_destroy(Oid indexId); extern void index_destroy(Oid indexId);
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.1.1.1 1996/07/09 06:21:15 scrappy Exp $ * $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.2 1996/08/26 06:29:38 scrappy Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -193,16 +193,8 @@ CatalogIndexInsert(Relation *idescs, ...@@ -193,16 +193,8 @@ CatalogIndexInsert(Relation *idescs,
nulls, nulls,
finfoP); finfoP);
newIndxTup = (IndexTuple)index_formtuple(indexDescriptor, indexRes = index_insert(idescs[i], &datum, nulls,
&datum,nulls); &(heapTuple->t_ctid));
Assert(newIndxTup);
/*
* Doing this structure assignment makes me quake in my boots when I
* think about portability.
*/
newIndxTup->t_tid = heapTuple->t_ctid;
indexRes = index_insert(idescs[i], newIndxTup);
if (indexRes) pfree(indexRes); if (indexRes) pfree(indexRes);
} }
} }
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: pg_am.h,v 1.1.1.1 1996/07/09 06:21:16 scrappy Exp $ * $Id: pg_am.h,v 1.2 1996/08/26 06:29:40 scrappy Exp $
* *
* NOTES * NOTES
* the genbki.sh script reads this file and generates .bki * the genbki.sh script reads this file and generates .bki
...@@ -103,6 +103,7 @@ DATA(insert OID = 405 ( hash PGUID "o" 1 1 hashgettuple hashinsert hashdelete ...@@ -103,6 +103,7 @@ DATA(insert OID = 405 ( hash PGUID "o" 1 1 hashgettuple hashinsert hashdelete
DATA(insert OID = 402 ( rtree PGUID "o" 8 3 rtgettuple rtinsert rtdelete - - - - rtbeginscan rtrescan rtendscan rtmarkpos rtrestrpos - - rtbuild - - )); DATA(insert OID = 402 ( rtree PGUID "o" 8 3 rtgettuple rtinsert rtdelete - - - - rtbeginscan rtrescan rtendscan rtmarkpos rtrestrpos - - rtbuild - - ));
DATA(insert OID = 403 ( btree PGUID "o" 5 1 btgettuple btinsert btdelete - - - - btbeginscan btrescan btendscan btmarkpos btrestrpos - - btbuild - - )); DATA(insert OID = 403 ( btree PGUID "o" 5 1 btgettuple btinsert btdelete - - - - btbeginscan btrescan btendscan btmarkpos btrestrpos - - btbuild - - ));
#define BTREE_AM_OID 403 #define BTREE_AM_OID 403
DATA(insert OID = 783 ( gist PGUID "o" 100 7 gistgettuple gistinsert gistdelete - - - - gistbeginscan gistrescan gistendscan gistmarkpos gistrestrpos - - gistbuild - - ));
BKI_BEGIN BKI_BEGIN
#ifdef NOBTREE #ifdef NOBTREE
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: pg_index.h,v 1.1.1.1 1996/07/09 06:21:17 scrappy Exp $ * $Id: pg_index.h,v 1.2 1996/08/26 06:29:43 scrappy Exp $
* *
* NOTES * NOTES
* the genbki.sh script reads this file and generates .bki * the genbki.sh script reads this file and generates .bki
...@@ -42,6 +42,8 @@ CATALOG(pg_index) { ...@@ -42,6 +42,8 @@ CATALOG(pg_index) {
bool indisclustered; bool indisclustered;
bool indisarchived; bool indisarchived;
text indpred; /* query plan for partial index predicate */ text indpred; /* query plan for partial index predicate */
bool indislossy; /* do we fetch false tuples (lossy compression)? */
bool indhaskeytype; /* does key type != attribute type? */
} FormData_pg_index; } FormData_pg_index;
#define INDEX_MAX_KEYS 8 /* maximum number of keys in an index definition */ #define INDEX_MAX_KEYS 8 /* maximum number of keys in an index definition */
...@@ -57,7 +59,7 @@ typedef FormData_pg_index *IndexTupleForm; ...@@ -57,7 +59,7 @@ typedef FormData_pg_index *IndexTupleForm;
* compiler constants for pg_index * compiler constants for pg_index
* ---------------- * ----------------
*/ */
#define Natts_pg_index 8 #define Natts_pg_index 10
#define Anum_pg_index_indexrelid 1 #define Anum_pg_index_indexrelid 1
#define Anum_pg_index_indrelid 2 #define Anum_pg_index_indrelid 2
#define Anum_pg_index_indproc 3 #define Anum_pg_index_indproc 3
...@@ -66,6 +68,8 @@ typedef FormData_pg_index *IndexTupleForm; ...@@ -66,6 +68,8 @@ typedef FormData_pg_index *IndexTupleForm;
#define Anum_pg_index_indisclustered 6 #define Anum_pg_index_indisclustered 6
#define Anum_pg_index_indisarchived 7 #define Anum_pg_index_indisarchived 7
#define Anum_pg_index_indpred 8 #define Anum_pg_index_indpred 8
#define Anum_pg_index_indislossy 9
#define Anum_pg_index_indhaskeytype 10
#endif /* PG_INDEX_H */ #endif /* PG_INDEX_H */
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: pg_proc.h,v 1.1.1.1 1996/07/09 06:21:18 scrappy Exp $ * $Id: pg_proc.h,v 1.2 1996/08/26 06:29:46 scrappy Exp $
* *
* NOTES * NOTES
* The script catalog/genbki.sh reads this file and generates .bki * The script catalog/genbki.sh reads this file and generates .bki
...@@ -385,7 +385,7 @@ DATA(insert OID = 313 ( i2toi4 PGUID 11 f t f 2 f 23 "21" 100 0 0 10 ...@@ -385,7 +385,7 @@ DATA(insert OID = 313 ( i2toi4 PGUID 11 f t f 2 f 23 "21" 100 0 0 10
DATA(insert OID = 314 ( i4toi2 PGUID 11 f t f 2 f 21 "23" 100 0 0 100 foo bar )); DATA(insert OID = 314 ( i4toi2 PGUID 11 f t f 2 f 21 "23" 100 0 0 100 foo bar ));
DATA(insert OID = 315 ( keyfirsteq PGUID 11 f t f 2 f 16 "0 21" 100 0 0 100 foo bar )); DATA(insert OID = 315 ( keyfirsteq PGUID 11 f t f 2 f 16 "0 21" 100 0 0 100 foo bar ));
DATA(insert OID = 320 ( rtinsert PGUID 11 f t f 2 f 23 "0" 100 0 0 100 foo bar )); DATA(insert OID = 320 ( rtinsert PGUID 11 f t f 4 f 23 "0" 100 0 0 100 foo bar ));
DATA(insert OID = 321 ( rtdelete PGUID 11 f t f 2 f 23 "0" 100 0 0 100 foo bar )); DATA(insert OID = 321 ( rtdelete PGUID 11 f t f 2 f 23 "0" 100 0 0 100 foo bar ));
DATA(insert OID = 322 ( rtgettuple PGUID 11 f t f 2 f 23 "0" 100 0 0 100 foo bar )); DATA(insert OID = 322 ( rtgettuple PGUID 11 f t f 2 f 23 "0" 100 0 0 100 foo bar ));
DATA(insert OID = 323 ( rtbuild PGUID 11 f t f 9 f 23 "0" 100 0 0 100 foo bar )); DATA(insert OID = 323 ( rtbuild PGUID 11 f t f 9 f 23 "0" 100 0 0 100 foo bar ));
...@@ -396,7 +396,7 @@ DATA(insert OID = 327 ( rtrestrpos PGUID 11 f t f 1 f 23 "0" 100 0 0 100 ...@@ -396,7 +396,7 @@ DATA(insert OID = 327 ( rtrestrpos PGUID 11 f t f 1 f 23 "0" 100 0 0 100
DATA(insert OID = 328 ( rtrescan PGUID 11 f t f 3 f 23 "0" 100 0 0 100 foo bar )); DATA(insert OID = 328 ( rtrescan PGUID 11 f t f 3 f 23 "0" 100 0 0 100 foo bar ));
DATA(insert OID = 330 ( btgettuple PGUID 11 f t f 2 f 23 "0" 100 0 0 100 foo bar )); DATA(insert OID = 330 ( btgettuple PGUID 11 f t f 2 f 23 "0" 100 0 0 100 foo bar ));
DATA(insert OID = 331 ( btinsert PGUID 11 f t f 2 f 23 "0" 100 0 0 100 foo bar )); DATA(insert OID = 331 ( btinsert PGUID 11 f t f 4 f 23 "0" 100 0 0 100 foo bar ));
DATA(insert OID = 332 ( btdelete PGUID 11 f t f 2 f 23 "0" 100 0 0 100 foo bar )); DATA(insert OID = 332 ( btdelete PGUID 11 f t f 2 f 23 "0" 100 0 0 100 foo bar ));
DATA(insert OID = 333 ( btbeginscan PGUID 11 f t f 4 f 23 "0" 100 0 0 100 foo bar )); DATA(insert OID = 333 ( btbeginscan PGUID 11 f t f 4 f 23 "0" 100 0 0 100 foo bar ));
DATA(insert OID = 334 ( btrescan PGUID 11 f t f 3 f 23 "0" 100 0 0 100 foo bar )); DATA(insert OID = 334 ( btrescan PGUID 11 f t f 3 f 23 "0" 100 0 0 100 foo bar ));
...@@ -448,7 +448,7 @@ DATA(insert OID = 438 ( hashsel PGUID 11 f t t 7 f 701 "26 26 21 0 23 ...@@ -448,7 +448,7 @@ DATA(insert OID = 438 ( hashsel PGUID 11 f t t 7 f 701 "26 26 21 0 23
DATA(insert OID = 439 ( hashnpage PGUID 11 f t t 7 f 701 "26 26 21 0 23 23 26" 100 0 0 100 foo bar )); DATA(insert OID = 439 ( hashnpage PGUID 11 f t t 7 f 701 "26 26 21 0 23 23 26" 100 0 0 100 foo bar ));
DATA(insert OID = 440 ( hashgettuple PGUID 11 f t f 2 f 23 "0" 100 0 0 100 foo bar )); DATA(insert OID = 440 ( hashgettuple PGUID 11 f t f 2 f 23 "0" 100 0 0 100 foo bar ));
DATA(insert OID = 441 ( hashinsert PGUID 11 f t f 2 f 23 "0" 100 0 0 100 foo bar )); DATA(insert OID = 441 ( hashinsert PGUID 11 f t f 4 f 23 "0" 100 0 0 100 foo bar ));
DATA(insert OID = 442 ( hashdelete PGUID 11 f t f 2 f 23 "0" 100 0 0 100 foo bar )); DATA(insert OID = 442 ( hashdelete PGUID 11 f t f 2 f 23 "0" 100 0 0 100 foo bar ));
DATA(insert OID = 443 ( hashbeginscan PGUID 11 f t f 4 f 23 "0" 100 0 0 100 foo bar )); DATA(insert OID = 443 ( hashbeginscan PGUID 11 f t f 4 f 23 "0" 100 0 0 100 foo bar ));
DATA(insert OID = 444 ( hashrescan PGUID 11 f t f 3 f 23 "0" 100 0 0 100 foo bar )); DATA(insert OID = 444 ( hashrescan PGUID 11 f t f 3 f 23 "0" 100 0 0 100 foo bar ));
...@@ -574,6 +574,17 @@ DATA(insert OID = 768 ( int4larger PGUID 11 f t f 2 f 23 "23 23" 100 0 0 ...@@ -574,6 +574,17 @@ DATA(insert OID = 768 ( int4larger PGUID 11 f t f 2 f 23 "23 23" 100 0 0
DATA(insert OID = 769 ( int4smaller PGUID 11 f t f 2 f 23 "23 23" 100 0 0 100 foo bar )); DATA(insert OID = 769 ( int4smaller PGUID 11 f t f 2 f 23 "23 23" 100 0 0 100 foo bar ));
DATA(insert OID = 770 ( int2larger PGUID 11 f t f 2 f 23 "21 21" 100 0 0 100 foo bar )); DATA(insert OID = 770 ( int2larger PGUID 11 f t f 2 f 23 "21 21" 100 0 0 100 foo bar ));
DATA(insert OID = 771 ( int2smaller PGUID 11 f t f 2 f 23 "21 21" 100 0 0 100 foo bar )); DATA(insert OID = 771 ( int2smaller PGUID 11 f t f 2 f 23 "21 21" 100 0 0 100 foo bar ));
DATA(insert OID = 772 ( gistsel PGUID 11 f t t 7 f 701 "26 26 21 0 23 23 26" 100 0 0 100 foo bar ));
DATA(insert OID = 773 ( gistnpage PGUID 11 f t t 7 f 701 "26 26 21 0 23 23 26" 100 0 0 100 foo bar ));
DATA(insert OID = 774 ( gistgettuple PGUID 11 f t f 2 f 23 "0" 100 0 0 100 foo bar ));
DATA(insert OID = 775 ( gistinsert PGUID 11 f t f 4 f 23 "0" 100 0 0 100 foo bar ));
DATA(insert OID = 776 ( gistdelete PGUID 11 f t f 2 f 23 "0" 100 0 0 100 foo bar ));
DATA(insert OID = 777 ( gistbeginscan PGUID 11 f t f 4 f 23 "0" 100 0 0 100 foo bar ));
DATA(insert OID = 778 ( gistrescan PGUID 11 f t f 3 f 23 "0" 100 0 0 100 foo bar ));
DATA(insert OID = 779 ( gistendscan PGUID 11 f t f 1 f 23 "0" 100 0 0 100 foo bar ));
DATA(insert OID = 780 ( gistmarkpos PGUID 11 f t f 1 f 23 "0" 100 0 0 100 foo bar ));
DATA(insert OID = 781 ( gistrestrpos PGUID 11 f t f 1 f 23 "0" 100 0 0 100 foo bar ));
DATA(insert OID = 782 ( gistbuild PGUID 11 f t f 9 f 23 "0" 100 0 0 100 foo bar ));
/* OIDS 800 - 899 */ /* OIDS 800 - 899 */
DATA(insert OID = 820 ( oidint2in PGUID 11 f t f 1 f 810 "0" 100 0 0 100 foo bar)); DATA(insert OID = 820 ( oidint2in PGUID 11 f t f 1 f 810 "0" 100 0 0 100 foo bar));
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/cluster.c,v 1.2 1996/08/15 07:39:24 scrappy Exp $ * $Header: /cvsroot/pgsql/src/backend/commands/cluster.c,v 1.3 1996/08/26 06:30:19 scrappy Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -316,11 +316,12 @@ copy_index(Oid OIDOldIndex, Oid OIDNewHeap) ...@@ -316,11 +316,12 @@ copy_index(Oid OIDOldIndex, Oid OIDNewHeap)
index_create((NewHeap->rd_rel->relname).data, index_create((NewHeap->rd_rel->relname).data,
NewIndexName, NewIndexName,
finfo, finfo,
- NULL, /* type info is in the old index */
Old_pg_index_relation_Form->relam, Old_pg_index_relation_Form->relam,
natts, natts,
Old_pg_index_Form->indkey, Old_pg_index_Form->indkey,
Old_pg_index_Form->indclass, Old_pg_index_Form->indclass,
(uint16)0, (Datum) NULL, NULL); (uint16)0, (Datum) NULL, NULL, Old_pg_index_Form->indislossy);
heap_close(OldIndex); heap_close(OldIndex);
heap_close(NewHeap); heap_close(NewHeap);
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.4 1996/08/24 20:48:14 scrappy Exp $ * $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.5 1996/08/26 06:30:21 scrappy Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -527,11 +527,9 @@ CopyFrom(Relation rel, bool binary, bool oids, FILE *fp, char *delim) ...@@ -527,11 +527,9 @@ CopyFrom(Relation rel, bool binary, bool oids, FILE *fp, char *delim)
&idatum, &idatum,
index_nulls, index_nulls,
finfoP[i]); finfoP[i]);
ituple = index_formtuple(itupdescArr[i], &idatum, index_nulls); indexRes = index_insert(index_rels[i], &idatum, index_nulls,
ituple->t_tid = tuple->t_ctid; &(tuple->t_ctid));
indexRes = index_insert(index_rels[i], ituple);
if (indexRes) pfree(indexRes); if (indexRes) pfree(indexRes);
pfree(ituple);
} }
} }
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/defind.c,v 1.3 1996/08/19 01:53:38 scrappy Exp $ * $Header: /cvsroot/pgsql/src/backend/commands/Attic/defind.c,v 1.4 1996/08/26 06:30:23 scrappy Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -86,8 +86,9 @@ DefineIndex(char *heapRelationName, ...@@ -86,8 +86,9 @@ DefineIndex(char *heapRelationName,
Datum *parameterA = NULL; Datum *parameterA = NULL;
FuncIndexInfo fInfo; FuncIndexInfo fInfo;
List *cnfPred = NULL; List *cnfPred = NULL;
bool lossy = FALSE;
List *pl;
/* /*
* Handle attributes * Handle attributes
*/ */
...@@ -123,7 +124,19 @@ DefineIndex(char *heapRelationName, ...@@ -123,7 +124,19 @@ DefineIndex(char *heapRelationName,
/* /*
* Handle parameters * Handle parameters
* [param list is now different (NOT USED, really) - ay 10/94] * [param list is now different (NOT USED, really) - ay 10/94]
*
* WITH clause reinstated to handle lossy indices.
* -- JMH, 7/22/96
*/ */
foreach(pl, parameterList) {
int count;
char *ptr;
ParamString *param = (ParamString*)lfirst(pl);
if (!strcasecmp(param->name, "islossy"))
lossy = TRUE;
}
/* /*
...@@ -167,9 +180,10 @@ DefineIndex(char *heapRelationName, ...@@ -167,9 +180,10 @@ DefineIndex(char *heapRelationName,
index_create(heapRelationName, index_create(heapRelationName,
indexRelationName, indexRelationName,
&fInfo, accessMethodId, &fInfo, NULL, accessMethodId,
numberOfAttributes, attributeNumberA, numberOfAttributes, attributeNumberA,
classObjectId, parameterCount, parameterA, (Node*)cnfPred); classObjectId, parameterCount, parameterA, (Node*)cnfPred,
lossy);
}else { }else {
attributeNumberA = attributeNumberA =
(AttrNumber *)palloc(numberOfAttributes * (AttrNumber *)palloc(numberOfAttributes *
...@@ -182,8 +196,10 @@ DefineIndex(char *heapRelationName, ...@@ -182,8 +196,10 @@ DefineIndex(char *heapRelationName,
classObjectId, relationId); classObjectId, relationId);
index_create(heapRelationName, indexRelationName, NULL, index_create(heapRelationName, indexRelationName, NULL,
((IndexElem*)lfirst(attributeList))->tname,
accessMethodId, numberOfAttributes, attributeNumberA, accessMethodId, numberOfAttributes, attributeNumberA,
classObjectId, parameterCount, parameterA, (Node*)cnfPred); classObjectId, parameterCount, parameterA, (Node*)cnfPred,
lossy);
} }
} }
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/executor/execUtils.c,v 1.1.1.1 1996/07/09 06:21:25 scrappy Exp $ * $Header: /cvsroot/pgsql/src/backend/executor/execUtils.c,v 1.2 1996/08/26 06:30:33 scrappy Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -1025,11 +1025,17 @@ ExecInsertIndexTuples(TupleTableSlot *slot, ...@@ -1025,11 +1025,17 @@ ExecInsertIndexTuples(TupleTableSlot *slot,
RelationPtr relationDescs; RelationPtr relationDescs;
Relation heapRelation; Relation heapRelation;
IndexInfo **indexInfoArray; IndexInfo **indexInfoArray;
IndexInfo *indexInfo;
Node *predicate; Node *predicate;
bool satisfied; bool satisfied;
ExprContext *econtext; ExprContext *econtext;
IndexTuple indexTuple;
InsertIndexResult result; InsertIndexResult result;
int numberOfAttributes;
AttrNumber *keyAttributeNumbers;
FuncIndexInfoPtr fInfoP;
TupleDesc heapDescriptor;
Datum *datum;
char *nulls;
heapTuple = slot->val; heapTuple = slot->val;
...@@ -1050,8 +1056,9 @@ ExecInsertIndexTuples(TupleTableSlot *slot, ...@@ -1050,8 +1056,9 @@ ExecInsertIndexTuples(TupleTableSlot *slot,
econtext = NULL; econtext = NULL;
for (i=0; i<numIndices; i++) { for (i=0; i<numIndices; i++) {
if (relationDescs[i] == NULL) continue; if (relationDescs[i] == NULL) continue;
predicate = indexInfoArray[i]->ii_Predicate; indexInfo = indexInfoArray[i];
predicate = indexInfo->ii_Predicate;
if (predicate != NULL) { if (predicate != NULL) {
if (econtext == NULL) { if (econtext == NULL) {
econtext = makeNode(ExprContext); econtext = makeNode(ExprContext);
...@@ -1063,16 +1070,32 @@ ExecInsertIndexTuples(TupleTableSlot *slot, ...@@ -1063,16 +1070,32 @@ ExecInsertIndexTuples(TupleTableSlot *slot,
if (satisfied == false) if (satisfied == false)
continue; continue;
} }
/* ----------------
* get information from index info structure
* ----------------
*/
numberOfAttributes = indexInfo->ii_NumKeyAttributes;
keyAttributeNumbers = indexInfo->ii_KeyAttributeNumbers;
fInfoP = indexInfo->ii_FuncIndexInfo;
datum = (Datum *) palloc(numberOfAttributes * sizeof *datum);
nulls = (char *) palloc(numberOfAttributes * sizeof *nulls);
heapDescriptor = (TupleDesc)RelationGetTupleDescriptor(heapRelation);
FormIndexDatum(numberOfAttributes, /* num attributes */
keyAttributeNumbers, /* array of att nums to extract */
heapTuple, /* tuple from base relation */
heapDescriptor, /* heap tuple's descriptor */
InvalidBuffer, /* buffer associated with heap tuple */
datum, /* return: array of attributes */
nulls, /* return: array of char's */
fInfoP); /* functional index information */
indexTuple = ExecFormIndexTuple(heapTuple,
heapRelation,
relationDescs[i],
indexInfoArray[i]);
indexTuple->t_tid = (*tupleid); /* structure assignment */
result = index_insert(relationDescs[i], /* index relation */ result = index_insert(relationDescs[i], /* index relation */
indexTuple); /* index tuple */ datum, /* array of heaptuple Datums */
nulls, /* info on nulls */
&(heapTuple->t_ctid)); /* oid of heap tuple */
/* ---------------- /* ----------------
* keep track of index inserts for debugging * keep track of index inserts for debugging
...@@ -1085,7 +1108,6 @@ ExecInsertIndexTuples(TupleTableSlot *slot, ...@@ -1085,7 +1108,6 @@ ExecInsertIndexTuples(TupleTableSlot *slot,
* ---------------- * ----------------
*/ */
if (result) pfree(result); if (result) pfree(result);
pfree(indexTuple);
} }
if (econtext != NULL) pfree(econtext); if (econtext != NULL) pfree(econtext);
} }
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.1.1.1 1996/07/09 06:21:32 scrappy Exp $ * $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.2 1996/08/26 06:30:51 scrappy Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -523,6 +523,19 @@ _equalEState(EState *a, EState *b) ...@@ -523,6 +523,19 @@ _equalEState(EState *a, EState *b)
return (true); return (true);
} }
static bool
_equalTargetEntry(TargetEntry *a, TargetEntry *b)
{
if (!equal(a->resdom,b->resdom))
return(false);
if (!equal(a->fjoin,b->fjoin))
return(false);
if (!equal(a->expr,b->expr))
return(false);
return(true);
}
/* /*
* equal -- are two lists equal? * equal -- are two lists equal?
...@@ -582,6 +595,9 @@ equal(void *a, void *b) ...@@ -582,6 +595,9 @@ equal(void *a, void *b)
case T_Expr: case T_Expr:
retval = _equalExpr(a, b); retval = _equalExpr(a, b);
break; break;
case T_TargetEntry:
retval = _equalTargetEntry(a,b);
break;
case T_Iter: case T_Iter:
retval = _equalIter(a, b); retval = _equalIter(a, b);
break; break;
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: parsenodes.h,v 1.4 1996/08/24 20:48:31 scrappy Exp $ * $Id: parsenodes.h,v 1.5 1996/08/26 06:30:54 scrappy Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -218,6 +218,7 @@ typedef struct IndexStmt { ...@@ -218,6 +218,7 @@ typedef struct IndexStmt {
Node *whereClause; /* qualifications */ Node *whereClause; /* qualifications */
List *rangetable; /* range table, filled in List *rangetable; /* range table, filled in
by transformStmt() */ by transformStmt() */
bool *lossy; /* is index lossy? */
} IndexStmt; } IndexStmt;
/* ---------------------- /* ----------------------
...@@ -655,6 +656,7 @@ typedef struct IndexElem { ...@@ -655,6 +656,7 @@ typedef struct IndexElem {
char *name; /* name of index */ char *name; /* name of index */
List *args; /* if not NULL, function index */ List *args; /* if not NULL, function index */
char *class; char *class;
TypeName *tname; /* type of index's keys (optional) */
} IndexElem; } IndexElem;
/* /*
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.1.1.1 1996/07/09 06:21:37 scrappy Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.2 1996/08/26 06:31:15 scrappy Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -316,8 +316,11 @@ create_indexscan_node(IndexPath *best_path, ...@@ -316,8 +316,11 @@ create_indexscan_node(IndexPath *best_path,
List *indxqual = NIL; List *indxqual = NIL;
List *qpqual = NIL; List *qpqual = NIL;
List *fixed_indxqual = NIL; List *fixed_indxqual = NIL;
List *ixid;
IndexScan *scan_node = (IndexScan*)NULL; IndexScan *scan_node = (IndexScan*)NULL;
bool lossy = FALSE;
HeapTuple indexTuple;
IndexTupleForm index;
/* /*
* If an 'or' clause is to be used with this index, the indxqual * If an 'or' clause is to be used with this index, the indxqual
...@@ -340,15 +343,42 @@ create_indexscan_node(IndexPath *best_path, ...@@ -340,15 +343,42 @@ create_indexscan_node(IndexPath *best_path,
NIL); NIL);
} }
/* check and see if any indices are lossy */
foreach (ixid, best_path->indexid) {
indexTuple = SearchSysCacheTuple(INDEXRELID,
ObjectIdGetDatum(lfirsti(ixid)),
0,0,0);
if (!HeapTupleIsValid(indexTuple))
elog(WARN, "create_plan: index %d not found",
lfirsti(ixid));
index = (IndexTupleForm)GETSTRUCT(indexTuple);
if (index->indislossy)
lossy = TRUE;
}
/* /*
* The qpqual field contains all restrictions except the indxqual. * The qpqual field contains all restrictions not automatically handled
* by the index. Note that for non-lossy indices, the predicates
* in the indxqual are handled by the index, while for lossy indices
* the indxqual predicates need to be double-checked after the
* index fetches the best-guess tuples.
*/ */
if(or_clause((Node*)index_clause)) if(or_clause((Node*)index_clause)) {
qpqual = set_difference(scan_clauses, qpqual = set_difference(scan_clauses,
lcons(index_clause,NIL)); lcons(index_clause,NIL));
else
if (lossy)
qpqual = nconc(qpqual,
lcons((List *)copyObject(index_clause),NIL));
}
else {
qpqual = set_difference(scan_clauses, lfirst(indxqual)); qpqual = set_difference(scan_clauses, lfirst(indxqual));
if (lossy)
qpqual = nconc(qpqual,
(List *)copyObject(lfirst(indxqual)));
}
fixed_indxqual = fixed_indxqual =
(List*)fix_indxqual_references((Node*)indxqual,(Path*)best_path); (List*)fix_indxqual_references((Node*)indxqual,(Path*)best_path);
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.8 1996/08/24 20:48:44 scrappy Exp $ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.9 1996/08/26 06:31:31 scrappy Exp $
* *
* HISTORY * HISTORY
* AUTHOR DATE MAJOR EVENT * AUTHOR DATE MAJOR EVENT
...@@ -140,7 +140,7 @@ static Node *makeA_Expr(int op, char *opname, Node *lexpr, Node *rexpr); ...@@ -140,7 +140,7 @@ static Node *makeA_Expr(int op, char *opname, Node *lexpr, Node *rexpr);
%type <pstmt> purge_quals %type <pstmt> purge_quals
%type <astmt> insert_rest %type <astmt> insert_rest
%type <typnam> Typename, typname %type <typnam> Typename, typname, opt_type
%type <coldef> columnDef %type <coldef> columnDef
%type <defelt> def_elem %type <defelt> def_elem
%type <node> def_arg, columnElem, exprElem, where_clause, %type <node> def_arg, columnElem, exprElem, where_clause,
...@@ -658,7 +658,7 @@ opt_portal_name: IN name { $$ = $2;} ...@@ -658,7 +658,7 @@ opt_portal_name: IN name { $$ = $2;}
*****************************************************************************/ *****************************************************************************/
IndexStmt: CREATE INDEX index_name ON relation_name IndexStmt: CREATE INDEX index_name ON relation_name
access_method_clause '(' index_params ')' access_method_clause '(' index_params ')' opt_with
{ {
/* should check that access_method is valid, /* should check that access_method is valid,
etc ... but doesn't */ etc ... but doesn't */
...@@ -667,7 +667,7 @@ IndexStmt: CREATE INDEX index_name ON relation_name ...@@ -667,7 +667,7 @@ IndexStmt: CREATE INDEX index_name ON relation_name
n->relname = $5; n->relname = $5;
n->accessMethod = $6; n->accessMethod = $6;
n->indexParams = $8; n->indexParams = $8;
n->withClause = NIL; n->withClause = $11;
n->whereClause = NULL; n->whereClause = NULL;
$$ = (Node *)n; $$ = (Node *)n;
} }
...@@ -1473,24 +1473,30 @@ index_params: index_elem { $$ = lcons($1,NIL); } ...@@ -1473,24 +1473,30 @@ index_params: index_elem { $$ = lcons($1,NIL); }
{ $$ = lcons($1, NIL); } { $$ = lcons($1, NIL); }
;*/ ;*/
func_index: name '(' name_list ')' opt_class func_index: name '(' name_list ')' opt_type opt_class
{ {
$$ = makeNode(IndexElem); $$ = makeNode(IndexElem);
$$->name = $1; $$->name = $1;
$$->args = $3; $$->args = $3;
$$->class = $5; $$->class = $6;
$$->tname = $5;
} }
; ;
index_elem: attr_name opt_class index_elem: attr_name opt_type opt_class
{ {
$$ = makeNode(IndexElem); $$ = makeNode(IndexElem);
$$->name = $1; $$->name = $1;
$$->args = NIL; $$->args = NIL;
$$->class = $2; $$->class = $3;
$$->tname = $2;
} }
; ;
opt_type: ':' Typename { $$ = $2;}
| /*EMPTY*/ { $$ = NULL;}
;
opt_class: class opt_class: class
| WITH class { $$ = $2; } | WITH class { $$ = $2; }
| /*EMPTY*/ { $$ = NULL; } | /*EMPTY*/ { $$ = NULL; }
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/storage/large_object/inv_api.c,v 1.1.1.1 1996/07/09 06:21:55 scrappy Exp $ * $Header: /cvsroot/pgsql/src/backend/storage/large_object/inv_api.c,v 1.2 1996/08/26 06:31:45 scrappy Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -157,9 +157,9 @@ inv_create(int flags) ...@@ -157,9 +157,9 @@ inv_create(int flags)
attNums[0] = 1; attNums[0] = 1;
classObjectId[0] = INT4_OPS_OID; classObjectId[0] = INT4_OPS_OID;
index_create(objname, indname, NULL, BTREE_AM_OID, index_create(objname, indname, NULL, NULL, BTREE_AM_OID,
1, &attNums[0], &classObjectId[0], 1, &attNums[0], &classObjectId[0],
0, (Datum) NULL, NULL); 0, (Datum) NULL, NULL, FALSE);
/* make the index visible in this transaction */ /* make the index visible in this transaction */
CommandCounterIncrement(); CommandCounterIncrement();
...@@ -996,23 +996,16 @@ inv_newtuple(LargeObjectDesc *obj_desc, ...@@ -996,23 +996,16 @@ inv_newtuple(LargeObjectDesc *obj_desc,
static void static void
inv_indextup(LargeObjectDesc *obj_desc, HeapTuple htup) inv_indextup(LargeObjectDesc *obj_desc, HeapTuple htup)
{ {
IndexTuple itup;
InsertIndexResult res; InsertIndexResult res;
Datum v[1]; Datum v[1];
char n[1]; char n[1];
n[0] = ' '; n[0] = ' ';
v[0] = Int32GetDatum(obj_desc->highbyte); v[0] = Int32GetDatum(obj_desc->highbyte);
itup = index_formtuple(obj_desc->idesc, &v[0], &n[0]); res = index_insert(obj_desc->index_r, &v[0], &n[0], &(htup->t_ctid));
memmove((char *)&(itup->t_tid),
(char *)&(htup->t_ctid),
sizeof(ItemPointerData));
res = index_insert(obj_desc->index_r, itup);
if (res) if (res)
pfree(res); pfree(res);
pfree(itup);
} }
/* /*
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/selfuncs.c,v 1.2 1996/07/31 18:48:16 scrappy Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/selfuncs.c,v 1.3 1996/08/26 06:32:06 scrappy Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -583,3 +583,29 @@ rtnpage(Oid operatorObjectId, ...@@ -583,3 +583,29 @@ rtnpage(Oid operatorObjectId,
return (btreenpage(operatorObjectId, indrelid, attributeNumber, return (btreenpage(operatorObjectId, indrelid, attributeNumber,
constValue, constFlag, nIndexKeys, indexrelid)); constValue, constFlag, nIndexKeys, indexrelid));
} }
float64
gistsel(Oid operatorObjectId,
Oid indrelid,
AttrNumber attributeNumber,
char *constValue,
int32 constFlag,
int32 nIndexKeys,
Oid indexrelid)
{
return (btreesel(operatorObjectId, indrelid, attributeNumber,
constValue, constFlag, nIndexKeys, indexrelid));
}
float64
gistnpage(Oid operatorObjectId,
Oid indrelid,
AttrNumber attributeNumber,
char *constValue,
int32 constFlag,
int32 nIndexKeys,
Oid indexrelid)
{
return (btreenpage(operatorObjectId, indrelid, attributeNumber,
constValue, constFlag, nIndexKeys, indexrelid));
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment