⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 indexing.c

📁 PostgreSQL7.4.6 for Linux
💻 C
字号:
/*------------------------------------------------------------------------- * * indexing.c *	  This file contains routines to support indexes defined on system *	  catalogs. * * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION *	  $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.104 2003/08/04 02:39:58 momjian Exp $ * *------------------------------------------------------------------------- */#include "postgres.h"#include "access/genam.h"#include "catalog/index.h"#include "catalog/indexing.h"#include "executor/executor.h"/* * CatalogOpenIndexes - open the indexes on a system catalog. * * When inserting or updating tuples in a system catalog, call this * to prepare to update the indexes for the catalog. * * In the current implementation, we share code for opening/closing the * indexes with execUtils.c.  But we do not use ExecInsertIndexTuples, * because we don't want to create an EState.  This implies that we * do not support partial or expressional indexes on system catalogs. * This could be fixed with localized changes here if we wanted to pay * the extra overhead of building an EState. */CatalogIndexStateCatalogOpenIndexes(Relation heapRel){	ResultRelInfo *resultRelInfo;	resultRelInfo = makeNode(ResultRelInfo);	resultRelInfo->ri_RangeTableIndex = 1;		/* dummy */	resultRelInfo->ri_RelationDesc = heapRel;	resultRelInfo->ri_TrigDesc = NULL;	/* we don't fire triggers */	ExecOpenIndices(resultRelInfo);	return resultRelInfo;}/* * CatalogCloseIndexes - clean up resources allocated by CatalogOpenIndexes */voidCatalogCloseIndexes(CatalogIndexState indstate){	ExecCloseIndices(indstate);	pfree(indstate);}/* * CatalogIndexInsert - insert index entries for one catalog tuple * * This should be called for each inserted or updated catalog tuple. * * This is effectively a cut-down version of ExecInsertIndexTuples. */voidCatalogIndexInsert(CatalogIndexState indstate, HeapTuple heapTuple){	int			i;	int			numIndexes;	RelationPtr relationDescs;	Relation	heapRelation;	TupleDesc	heapDescriptor;	IndexInfo **indexInfoArray;	Datum		datum[INDEX_MAX_KEYS];	char		nullv[INDEX_MAX_KEYS];	/*	 * Get information from the state structure.	 */	numIndexes = indstate->ri_NumIndices;	relationDescs = indstate->ri_IndexRelationDescs;	indexInfoArray = indstate->ri_IndexRelationInfo;	heapRelation = indstate->ri_RelationDesc;	heapDescriptor = RelationGetDescr(heapRelation);	/*	 * for each index, form and insert the index tuple	 */	for (i = 0; i < numIndexes; i++)	{		IndexInfo  *indexInfo;		InsertIndexResult result;		indexInfo = indexInfoArray[i];		/*		 * Expressional and partial indexes on system catalogs are not		 * supported		 */		Assert(indexInfo->ii_Expressions == NIL);		Assert(indexInfo->ii_Predicate == NIL);		/*		 * FormIndexDatum fills in its datum and null parameters with		 * attribute information taken from the given heap tuple.		 */		FormIndexDatum(indexInfo,					   heapTuple,					   heapDescriptor,					   NULL,	/* no expression eval to do */					   datum,					   nullv);		/*		 * The index AM does the rest.		 */		result = index_insert(relationDescs[i], /* index relation */							  datum,	/* array of heaptuple Datums */							  nullv,	/* info on nulls */							  &(heapTuple->t_self),		/* tid of heap tuple */							  heapRelation,							  relationDescs[i]->rd_index->indisunique);		if (result)			pfree(result);	}}/* * CatalogUpdateIndexes - do all the indexing work for a new catalog tuple * * This is a convenience routine for the common case where we only need * to insert or update a single tuple in a system catalog.	Avoid using it for * multiple tuples, since opening the indexes and building the index info * structures is moderately expensive. */voidCatalogUpdateIndexes(Relation heapRel, HeapTuple heapTuple){	CatalogIndexState indstate;	indstate = CatalogOpenIndexes(heapRel);	CatalogIndexInsert(indstate, heapTuple);	CatalogCloseIndexes(indstate);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -