aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/defind.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/commands/defind.c')
-rw-r--r--src/backend/commands/defind.c899
1 files changed, 467 insertions, 432 deletions
diff --git a/src/backend/commands/defind.c b/src/backend/commands/defind.c
index c6b293fec68..9b8c5a0218a 100644
--- a/src/backend/commands/defind.c
+++ b/src/backend/commands/defind.c
@@ -1,13 +1,13 @@
/*-------------------------------------------------------------------------
*
* defind.c--
- * POSTGRES define, extend and remove index code.
+ * POSTGRES define, extend and remove index code.
*
* Copyright (c) 1994, Regents of the University of California
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/Attic/defind.c,v 1.12 1997/03/26 03:05:28 vadim Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/Attic/defind.c,v 1.13 1997/09/07 04:40:43 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -30,7 +30,7 @@
#include <utils/relcache.h>
#include <utils/lsyscache.h>
#include <commands/defrem.h>
-#include <parser/parsetree.h> /* for getrelid() */
+#include <parser/parsetree.h> /* for getrelid() */
#include <optimizer/prep.h>
#include <optimizer/clauses.h>
#include <storage/lmgr.h>
@@ -39,508 +39,543 @@
#define IsFuncIndex(ATTR_LIST) (((IndexElem*)lfirst(ATTR_LIST))->args!=NULL)
/* non-export function prototypes */
-static void CheckPredicate(List *predList, List *rangeTable, Oid baseRelOid);
-static void CheckPredExpr(Node *predicate, List *rangeTable,
+static void CheckPredicate(List * predList, List * rangeTable, Oid baseRelOid);
+static void
+CheckPredExpr(Node * predicate, List * rangeTable,
Oid baseRelOid);
static void
-CheckPredClause(Expr *predicate, List *rangeTable, Oid baseRelOid);
-static void FuncIndexArgs(IndexElem *funcIndex, AttrNumber *attNumP,
- Oid *argTypes, Oid *opOidP, Oid relId);
-static void NormIndexAttrs(List *attList, AttrNumber *attNumP,
- Oid *opOidP, Oid relId);
-static char *GetDefaultOpClass(Oid atttypid);
+ CheckPredClause(Expr * predicate, List * rangeTable, Oid baseRelOid);
+static void
+FuncIndexArgs(IndexElem * funcIndex, AttrNumber * attNumP,
+ Oid * argTypes, Oid * opOidP, Oid relId);
+static void
+NormIndexAttrs(List * attList, AttrNumber * attNumP,
+ Oid * opOidP, Oid relId);
+static char *GetDefaultOpClass(Oid atttypid);
/*
* DefineIndex --
- * Creates a new index.
+ * Creates a new index.
*
* 'attributeList' is a list of IndexElem specifying either a functional
- * index or a list of attributes to index on.
+ * index or a list of attributes to index on.
* 'parameterList' is a list of ParamString specified in the with clause.
* 'predicate' is the qual specified in the where clause.
* 'rangetable' is for the predicate
*
* Exceptions:
- * XXX
+ * XXX
*/
void
DefineIndex(char *heapRelationName,
- char *indexRelationName,
- char *accessMethodName,
- List *attributeList,
- List *parameterList,
- bool unique,
- Expr *predicate,
- List *rangetable)
+ char *indexRelationName,
+ char *accessMethodName,
+ List * attributeList,
+ List * parameterList,
+ bool unique,
+ Expr * predicate,
+ List * rangetable)
{
- Oid *classObjectId;
- Oid accessMethodId;
- Oid relationId;
- int numberOfAttributes;
- AttrNumber *attributeNumberA;
- HeapTuple tuple;
- uint16 parameterCount = 0;
- Datum *parameterA = NULL;
- FuncIndexInfo fInfo;
- List *cnfPred = NULL;
- bool lossy = FALSE;
- List *pl;
-
- /*
- * Handle attributes
- */
- numberOfAttributes = length(attributeList);
- if (numberOfAttributes <= 0) {
- elog(WARN, "DefineIndex: must specify at least one attribute");
- }
-
- /*
- * compute heap relation id
- */
- tuple = SearchSysCacheTuple(RELNAME,
- PointerGetDatum(heapRelationName),
- 0,0,0);
- if (!HeapTupleIsValid(tuple)) {
- elog(WARN, "DefineIndex: %s relation not found",
- heapRelationName);
- }
- relationId = tuple->t_oid;
-
- if (unique && strcmp(accessMethodName,"btree") != 0)
- elog(WARN, "DefineIndex: unique indices are only available with the btree access method");
-
- if (numberOfAttributes > 1 && strcmp(accessMethodName,"btree") != 0)
- elog(WARN, "DefineIndex: multi-column indices are only available with the btree access method");
-
- /*
- * compute access method id
- */
- tuple = SearchSysCacheTuple(AMNAME, PointerGetDatum(accessMethodName),
- 0,0,0);
- if (!HeapTupleIsValid(tuple)) {
- elog(WARN, "DefineIndex: %s access method not found",
- accessMethodName);
- }
- accessMethodId = tuple->t_oid;
-
-
- /*
- * Handle parameters
- * [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) {
- ParamString *param = (ParamString*)lfirst(pl);
-
- if (!strcasecmp(param->name, "islossy"))
- lossy = TRUE;
- }
-
-
- /*
- * Convert the partial-index predicate from parsetree form to plan
- * form, so it can be readily evaluated during index creation.
- * Note: "predicate" comes in as a list containing (1) the predicate
- * itself (a where_clause), and (2) a corresponding range table.
- *
- * [(1) is 'predicate' and (2) is 'rangetable' now. - ay 10/94]
- */
- if (predicate != NULL && rangetable != NIL) {
- cnfPred = cnfify((Expr*)copyObject(predicate), true);
- fix_opids(cnfPred);
- CheckPredicate(cnfPred, rangetable, relationId);
- }
-
- if (IsFuncIndex(attributeList)) {
- IndexElem *funcIndex= lfirst(attributeList);
- int nargs;
-
- nargs = length(funcIndex->args);
- if (nargs > INDEX_MAX_KEYS) {
- elog(WARN,
- "Too many args to function, limit of %d",
- INDEX_MAX_KEYS);
+ Oid *classObjectId;
+ Oid accessMethodId;
+ Oid relationId;
+ int numberOfAttributes;
+ AttrNumber *attributeNumberA;
+ HeapTuple tuple;
+ uint16 parameterCount = 0;
+ Datum *parameterA = NULL;
+ FuncIndexInfo fInfo;
+ List *cnfPred = NULL;
+ bool lossy = FALSE;
+ List *pl;
+
+ /*
+ * Handle attributes
+ */
+ numberOfAttributes = length(attributeList);
+ if (numberOfAttributes <= 0)
+ {
+ elog(WARN, "DefineIndex: must specify at least one attribute");
+ }
+
+ /*
+ * compute heap relation id
+ */
+ tuple = SearchSysCacheTuple(RELNAME,
+ PointerGetDatum(heapRelationName),
+ 0, 0, 0);
+ if (!HeapTupleIsValid(tuple))
+ {
+ elog(WARN, "DefineIndex: %s relation not found",
+ heapRelationName);
}
-
- FIsetnArgs(&fInfo,nargs);
+ relationId = tuple->t_oid;
- strcpy(FIgetname(&fInfo), funcIndex->name);
+ if (unique && strcmp(accessMethodName, "btree") != 0)
+ elog(WARN, "DefineIndex: unique indices are only available with the btree access method");
- attributeNumberA =
- (AttrNumber *)palloc(nargs * sizeof attributeNumberA[0]);
-
- classObjectId = (Oid *)palloc(sizeof classObjectId[0]);
-
-
- FuncIndexArgs(funcIndex, attributeNumberA,
- &(FIgetArg(&fInfo, 0)),
- classObjectId, relationId);
-
- index_create(heapRelationName,
- indexRelationName,
- &fInfo, NULL, accessMethodId,
- numberOfAttributes, attributeNumberA,
- classObjectId, parameterCount, parameterA, (Node*)cnfPred,
- lossy, unique);
- }else {
- attributeNumberA =
- (AttrNumber *)palloc(numberOfAttributes *
- sizeof attributeNumberA[0]);
-
- classObjectId =
- (Oid *)palloc(numberOfAttributes * sizeof classObjectId[0]);
-
- NormIndexAttrs(attributeList, attributeNumberA,
- classObjectId, relationId);
-
- index_create(heapRelationName, indexRelationName, NULL,
- attributeList,
- accessMethodId, numberOfAttributes, attributeNumberA,
- classObjectId, parameterCount, parameterA, (Node*)cnfPred,
- lossy, unique);
- }
+ if (numberOfAttributes > 1 && strcmp(accessMethodName, "btree") != 0)
+ elog(WARN, "DefineIndex: multi-column indices are only available with the btree access method");
+
+ /*
+ * compute access method id
+ */
+ tuple = SearchSysCacheTuple(AMNAME, PointerGetDatum(accessMethodName),
+ 0, 0, 0);
+ if (!HeapTupleIsValid(tuple))
+ {
+ elog(WARN, "DefineIndex: %s access method not found",
+ accessMethodName);
+ }
+ accessMethodId = tuple->t_oid;
+
+
+ /*
+ * Handle parameters [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)
+ {
+ ParamString *param = (ParamString *) lfirst(pl);
+
+ if (!strcasecmp(param->name, "islossy"))
+ lossy = TRUE;
+ }
+
+
+ /*
+ * Convert the partial-index predicate from parsetree form to plan
+ * form, so it can be readily evaluated during index creation. Note:
+ * "predicate" comes in as a list containing (1) the predicate itself
+ * (a where_clause), and (2) a corresponding range table.
+ *
+ * [(1) is 'predicate' and (2) is 'rangetable' now. - ay 10/94]
+ */
+ if (predicate != NULL && rangetable != NIL)
+ {
+ cnfPred = cnfify((Expr *) copyObject(predicate), true);
+ fix_opids(cnfPred);
+ CheckPredicate(cnfPred, rangetable, relationId);
+ }
+
+ if (IsFuncIndex(attributeList))
+ {
+ IndexElem *funcIndex = lfirst(attributeList);
+ int nargs;
+
+ nargs = length(funcIndex->args);
+ if (nargs > INDEX_MAX_KEYS)
+ {
+ elog(WARN,
+ "Too many args to function, limit of %d",
+ INDEX_MAX_KEYS);
+ }
+
+ FIsetnArgs(&fInfo, nargs);
+
+ strcpy(FIgetname(&fInfo), funcIndex->name);
+
+ attributeNumberA =
+ (AttrNumber *) palloc(nargs * sizeof attributeNumberA[0]);
+
+ classObjectId = (Oid *) palloc(sizeof classObjectId[0]);
+
+
+ FuncIndexArgs(funcIndex, attributeNumberA,
+ &(FIgetArg(&fInfo, 0)),
+ classObjectId, relationId);
+
+ index_create(heapRelationName,
+ indexRelationName,
+ &fInfo, NULL, accessMethodId,
+ numberOfAttributes, attributeNumberA,
+ classObjectId, parameterCount, parameterA, (Node *) cnfPred,
+ lossy, unique);
+ }
+ else
+ {
+ attributeNumberA =
+ (AttrNumber *) palloc(numberOfAttributes *
+ sizeof attributeNumberA[0]);
+
+ classObjectId =
+ (Oid *) palloc(numberOfAttributes * sizeof classObjectId[0]);
+
+ NormIndexAttrs(attributeList, attributeNumberA,
+ classObjectId, relationId);
+
+ index_create(heapRelationName, indexRelationName, NULL,
+ attributeList,
+ accessMethodId, numberOfAttributes, attributeNumberA,
+ classObjectId, parameterCount, parameterA, (Node *) cnfPred,
+ lossy, unique);
+ }
}
/*
* ExtendIndex --
- * Extends a partial index.
+ * Extends a partial index.
*
* Exceptions:
- * XXX
+ * XXX
*/
void
-ExtendIndex(char *indexRelationName, Expr *predicate, List *rangetable)
+ExtendIndex(char *indexRelationName, Expr * predicate, List * rangetable)
{
- Oid *classObjectId;
- Oid accessMethodId;
- Oid indexId, relationId;
- Oid indproc;
- int numberOfAttributes;
- AttrNumber *attributeNumberA;
- HeapTuple tuple;
- FuncIndexInfo fInfo;
- FuncIndexInfo *funcInfo = NULL;
- IndexTupleForm index;
- Node *oldPred = NULL;
- List *cnfPred = NULL;
- PredInfo *predInfo;
- Relation heapRelation;
- Relation indexRelation;
- int i;
-
- /*
- * compute index relation id and access method id
- */
- tuple = SearchSysCacheTuple(RELNAME, PointerGetDatum(indexRelationName),
- 0,0,0);
- if (!HeapTupleIsValid(tuple)) {
- elog(WARN, "ExtendIndex: %s index not found",
- indexRelationName);
- }
- indexId = tuple->t_oid;
- accessMethodId = ((Form_pg_class) GETSTRUCT(tuple))->relam;
-
- /*
- * find pg_index tuple
- */
- tuple = SearchSysCacheTuple(INDEXRELID,
- ObjectIdGetDatum(indexId),
- 0,0,0);
- if (!HeapTupleIsValid(tuple)) {
- elog(WARN, "ExtendIndex: %s is not an index",
- indexRelationName);
- }
-
- /*
- * Extract info from the pg_index tuple
- */
- index = (IndexTupleForm)GETSTRUCT(tuple);
- Assert(index->indexrelid == indexId);
- relationId = index->indrelid;
- indproc = index->indproc;
-
- for (i=0; i<INDEX_MAX_KEYS; i++)
- if (index->indkey[i] == 0) break;
- numberOfAttributes = i;
-
- if (VARSIZE(&index->indpred) != 0) {
- char *predString;
-
- predString = fmgr(F_TEXTOUT, &index->indpred);
- oldPred = stringToNode(predString);
- pfree(predString);
- }
- if (oldPred == NULL)
- elog(WARN, "ExtendIndex: %s is not a partial index",
- indexRelationName);
-
- /*
- * Convert the extension predicate from parsetree form to plan
- * form, so it can be readily evaluated during index creation.
- * Note: "predicate" comes in as a list containing (1) the predicate
- * itself (a where_clause), and (2) a corresponding range table.
- */
- if (rangetable != NIL) {
- cnfPred = cnfify((Expr*)copyObject(predicate), true);
- fix_opids(cnfPred);
- CheckPredicate(cnfPred, rangetable, relationId);
- }
-
- /* make predInfo list to pass to index_build */
- predInfo = (PredInfo*)palloc(sizeof(PredInfo));
- predInfo->pred = (Node*)cnfPred;
- predInfo->oldPred = oldPred;
-
- attributeNumberA =
- (AttrNumber *)palloc(numberOfAttributes*
- sizeof attributeNumberA[0]);
- classObjectId =
- (Oid *)palloc(numberOfAttributes * sizeof classObjectId[0]);
-
-
- for (i=0; i<numberOfAttributes; i++) {
- attributeNumberA[i] = index->indkey[i];
- classObjectId[i] = index->indclass[i];
- }
-
- if (indproc != InvalidOid) {
- funcInfo = &fInfo;
-/* FIgetnArgs(funcInfo) = numberOfAttributes; */
- FIsetnArgs(funcInfo,numberOfAttributes);
-
- tuple = SearchSysCacheTuple(PROOID,
- ObjectIdGetDatum(indproc),
- 0,0,0);
+ Oid *classObjectId;
+ Oid accessMethodId;
+ Oid indexId,
+ relationId;
+ Oid indproc;
+ int numberOfAttributes;
+ AttrNumber *attributeNumberA;
+ HeapTuple tuple;
+ FuncIndexInfo fInfo;
+ FuncIndexInfo *funcInfo = NULL;
+ IndexTupleForm index;
+ Node *oldPred = NULL;
+ List *cnfPred = NULL;
+ PredInfo *predInfo;
+ Relation heapRelation;
+ Relation indexRelation;
+ int i;
+
+ /*
+ * compute index relation id and access method id
+ */
+ tuple = SearchSysCacheTuple(RELNAME, PointerGetDatum(indexRelationName),
+ 0, 0, 0);
+ if (!HeapTupleIsValid(tuple))
+ {
+ elog(WARN, "ExtendIndex: %s index not found",
+ indexRelationName);
+ }
+ indexId = tuple->t_oid;
+ accessMethodId = ((Form_pg_class) GETSTRUCT(tuple))->relam;
+
+ /*
+ * find pg_index tuple
+ */
+ tuple = SearchSysCacheTuple(INDEXRELID,
+ ObjectIdGetDatum(indexId),
+ 0, 0, 0);
if (!HeapTupleIsValid(tuple))
- elog(WARN, "ExtendIndex: index procedure not found");
-
- namecpy(&(funcInfo->funcName),
- &(((Form_pg_proc) GETSTRUCT(tuple))->proname));
-
- FIsetProcOid(funcInfo,tuple->t_oid);
- }
-
- heapRelation = heap_open(relationId);
- indexRelation = index_open(indexId);
-
- RelationSetLockForWrite(heapRelation);
-
- InitIndexStrategy(numberOfAttributes, indexRelation, accessMethodId);
-
- index_build(heapRelation, indexRelation, numberOfAttributes,
- attributeNumberA, 0, NULL, funcInfo, predInfo);
+ {
+ elog(WARN, "ExtendIndex: %s is not an index",
+ indexRelationName);
+ }
+
+ /*
+ * Extract info from the pg_index tuple
+ */
+ index = (IndexTupleForm) GETSTRUCT(tuple);
+ Assert(index->indexrelid == indexId);
+ relationId = index->indrelid;
+ indproc = index->indproc;
+
+ for (i = 0; i < INDEX_MAX_KEYS; i++)
+ if (index->indkey[i] == 0)
+ break;
+ numberOfAttributes = i;
+
+ if (VARSIZE(&index->indpred) != 0)
+ {
+ char *predString;
+
+ predString = fmgr(F_TEXTOUT, &index->indpred);
+ oldPred = stringToNode(predString);
+ pfree(predString);
+ }
+ if (oldPred == NULL)
+ elog(WARN, "ExtendIndex: %s is not a partial index",
+ indexRelationName);
+
+ /*
+ * Convert the extension predicate from parsetree form to plan form,
+ * so it can be readily evaluated during index creation. Note:
+ * "predicate" comes in as a list containing (1) the predicate itself
+ * (a where_clause), and (2) a corresponding range table.
+ */
+ if (rangetable != NIL)
+ {
+ cnfPred = cnfify((Expr *) copyObject(predicate), true);
+ fix_opids(cnfPred);
+ CheckPredicate(cnfPred, rangetable, relationId);
+ }
+
+ /* make predInfo list to pass to index_build */
+ predInfo = (PredInfo *) palloc(sizeof(PredInfo));
+ predInfo->pred = (Node *) cnfPred;
+ predInfo->oldPred = oldPred;
+
+ attributeNumberA =
+ (AttrNumber *) palloc(numberOfAttributes *
+ sizeof attributeNumberA[0]);
+ classObjectId =
+ (Oid *) palloc(numberOfAttributes * sizeof classObjectId[0]);
+
+
+ for (i = 0; i < numberOfAttributes; i++)
+ {
+ attributeNumberA[i] = index->indkey[i];
+ classObjectId[i] = index->indclass[i];
+ }
+
+ if (indproc != InvalidOid)
+ {
+ funcInfo = &fInfo;
+/* FIgetnArgs(funcInfo) = numberOfAttributes; */
+ FIsetnArgs(funcInfo, numberOfAttributes);
+
+ tuple = SearchSysCacheTuple(PROOID,
+ ObjectIdGetDatum(indproc),
+ 0, 0, 0);
+ if (!HeapTupleIsValid(tuple))
+ elog(WARN, "ExtendIndex: index procedure not found");
+
+ namecpy(&(funcInfo->funcName),
+ &(((Form_pg_proc) GETSTRUCT(tuple))->proname));
+
+ FIsetProcOid(funcInfo, tuple->t_oid);
+ }
+
+ heapRelation = heap_open(relationId);
+ indexRelation = index_open(indexId);
+
+ RelationSetLockForWrite(heapRelation);
+
+ InitIndexStrategy(numberOfAttributes, indexRelation, accessMethodId);
+
+ index_build(heapRelation, indexRelation, numberOfAttributes,
+ attributeNumberA, 0, NULL, funcInfo, predInfo);
}
/*
* CheckPredicate
- * Checks that the given list of partial-index predicates refer
- * (via the given range table) only to the given base relation oid,
- * and that they're in a form the planner can handle, i.e.,
- * boolean combinations of "ATTR OP CONST" (yes, for now, the ATTR
- * has to be on the left).
+ * Checks that the given list of partial-index predicates refer
+ * (via the given range table) only to the given base relation oid,
+ * and that they're in a form the planner can handle, i.e.,
+ * boolean combinations of "ATTR OP CONST" (yes, for now, the ATTR
+ * has to be on the left).
*/
static void
-CheckPredicate(List *predList, List *rangeTable, Oid baseRelOid)
+CheckPredicate(List * predList, List * rangeTable, Oid baseRelOid)
{
- List *item;
-
- foreach (item, predList) {
- CheckPredExpr(lfirst(item), rangeTable, baseRelOid);
- }
+ List *item;
+
+ foreach(item, predList)
+ {
+ CheckPredExpr(lfirst(item), rangeTable, baseRelOid);
+ }
}
static void
-CheckPredExpr(Node *predicate, List *rangeTable, Oid baseRelOid)
+CheckPredExpr(Node * predicate, List * rangeTable, Oid baseRelOid)
{
- List *clauses = NIL, *clause;
-
- if (is_opclause(predicate)) {
- CheckPredClause((Expr*)predicate, rangeTable, baseRelOid);
- return;
- } else if (or_clause(predicate))
- clauses = ((Expr*)predicate)->args;
- else if (and_clause(predicate))
- clauses = ((Expr*)predicate)->args;
- else
- elog(WARN, "Unsupported partial-index predicate expression type");
-
- foreach (clause, clauses) {
- CheckPredExpr(lfirst(clause), rangeTable, baseRelOid);
- }
+ List *clauses = NIL,
+ *clause;
+
+ if (is_opclause(predicate))
+ {
+ CheckPredClause((Expr *) predicate, rangeTable, baseRelOid);
+ return;
+ }
+ else if (or_clause(predicate))
+ clauses = ((Expr *) predicate)->args;
+ else if (and_clause(predicate))
+ clauses = ((Expr *) predicate)->args;
+ else
+ elog(WARN, "Unsupported partial-index predicate expression type");
+
+ foreach(clause, clauses)
+ {
+ CheckPredExpr(lfirst(clause), rangeTable, baseRelOid);
+ }
}
static void
-CheckPredClause(Expr *predicate, List *rangeTable, Oid baseRelOid)
+CheckPredClause(Expr * predicate, List * rangeTable, Oid baseRelOid)
{
- Var *pred_var;
- Const *pred_const;
-
- pred_var = (Var *)get_leftop(predicate);
- pred_const = (Const *)get_rightop(predicate);
-
- if (!IsA(predicate->oper,Oper) ||
- !IsA(pred_var,Var) ||
- !IsA(pred_const,Const)) {
- elog(WARN, "Unsupported partial-index predicate clause type");
- }
-
- if (getrelid(pred_var->varno, rangeTable) != baseRelOid)
- elog(WARN,
- "Partial-index predicates may refer only to the base relation");
+ Var *pred_var;
+ Const *pred_const;
+
+ pred_var = (Var *) get_leftop(predicate);
+ pred_const = (Const *) get_rightop(predicate);
+
+ if (!IsA(predicate->oper, Oper) ||
+ !IsA(pred_var, Var) ||
+ !IsA(pred_const, Const))
+ {
+ elog(WARN, "Unsupported partial-index predicate clause type");
+ }
+
+ if (getrelid(pred_var->varno, rangeTable) != baseRelOid)
+ elog(WARN,
+ "Partial-index predicates may refer only to the base relation");
}
-static void
-FuncIndexArgs(IndexElem *funcIndex,
- AttrNumber *attNumP,
- Oid *argTypes,
- Oid *opOidP,
- Oid relId)
+static void
+FuncIndexArgs(IndexElem * funcIndex,
+ AttrNumber * attNumP,
+ Oid * argTypes,
+ Oid * opOidP,
+ Oid relId)
{
- List *rest;
- HeapTuple tuple;
- AttributeTupleForm att;
-
- tuple = SearchSysCacheTuple(CLANAME,
- PointerGetDatum(funcIndex->class),
- 0,0,0);
-
- if (!HeapTupleIsValid(tuple))
+ List *rest;
+ HeapTuple tuple;
+ AttributeTupleForm att;
+
+ tuple = SearchSysCacheTuple(CLANAME,
+ PointerGetDatum(funcIndex->class),
+ 0, 0, 0);
+
+ if (!HeapTupleIsValid(tuple))
{
- elog(WARN, "DefineIndex: %s class not found",
- funcIndex->class);
+ elog(WARN, "DefineIndex: %s class not found",
+ funcIndex->class);
}
- *opOidP = tuple->t_oid;
-
- memset(argTypes, 0, 8 * sizeof(Oid));
-
- /*
- * process the function arguments
- */
- for (rest=funcIndex->args; rest != NIL; rest = lnext(rest)) {
- char *arg;
-
- arg = strVal(lfirst(rest));
-
- tuple = SearchSysCacheTuple(ATTNAME,
- ObjectIdGetDatum(relId),
- PointerGetDatum(arg),0,0);
-
- if (!HeapTupleIsValid(tuple)) {
- elog(WARN,
- "DefineIndex: attribute \"%s\" not found",
- arg);
+ *opOidP = tuple->t_oid;
+
+ memset(argTypes, 0, 8 * sizeof(Oid));
+
+ /*
+ * process the function arguments
+ */
+ for (rest = funcIndex->args; rest != NIL; rest = lnext(rest))
+ {
+ char *arg;
+
+ arg = strVal(lfirst(rest));
+
+ tuple = SearchSysCacheTuple(ATTNAME,
+ ObjectIdGetDatum(relId),
+ PointerGetDatum(arg), 0, 0);
+
+ if (!HeapTupleIsValid(tuple))
+ {
+ elog(WARN,
+ "DefineIndex: attribute \"%s\" not found",
+ arg);
+ }
+ att = (AttributeTupleForm) GETSTRUCT(tuple);
+ *attNumP++ = att->attnum;
+ *argTypes++ = att->atttypid;
}
- att = (AttributeTupleForm)GETSTRUCT(tuple);
- *attNumP++ = att->attnum;
- *argTypes++ = att->atttypid;
- }
}
-static void
-NormIndexAttrs(List *attList, /* list of IndexElem's */
- AttrNumber *attNumP,
- Oid *opOidP,
- Oid relId)
+static void
+NormIndexAttrs(List * attList, /* list of IndexElem's */
+ AttrNumber * attNumP,
+ Oid * opOidP,
+ Oid relId)
{
- List *rest;
- HeapTuple tuple;
-
- /*
- * process attributeList
- */
-
- for (rest=attList; rest != NIL; rest = lnext(rest)) {
- IndexElem *attribute;
- AttributeTupleForm attform;
-
- attribute = lfirst(rest);
-
- if (attribute->name == NULL)
- elog(WARN, "missing attribute for define index");
-
- tuple = SearchSysCacheTuple(ATTNAME,
- ObjectIdGetDatum(relId),
- PointerGetDatum(attribute->name),
- 0,0);
- if (!HeapTupleIsValid(tuple)) {
- elog(WARN,
- "DefineIndex: attribute \"%s\" not found",
- attribute->name);
- }
+ List *rest;
+ HeapTuple tuple;
- attform = (AttributeTupleForm)GETSTRUCT(tuple);
- *attNumP++ = attform->attnum;
-
- if (attribute->class == NULL) {
- /* no operator class specified, so find the default */
- attribute->class = GetDefaultOpClass(attform->atttypid);
- if(attribute->class == NULL) {
- elog(WARN,
- "Can't find a default operator class for type %d.",
- attform->atttypid);
- }
- }
-
- tuple = SearchSysCacheTuple(CLANAME,
- PointerGetDatum(attribute->class),
- 0,0,0);
-
- if (!HeapTupleIsValid(tuple)) {
- elog(WARN, "DefineIndex: %s class not found",
- attribute->class);
+ /*
+ * process attributeList
+ */
+
+ for (rest = attList; rest != NIL; rest = lnext(rest))
+ {
+ IndexElem *attribute;
+ AttributeTupleForm attform;
+
+ attribute = lfirst(rest);
+
+ if (attribute->name == NULL)
+ elog(WARN, "missing attribute for define index");
+
+ tuple = SearchSysCacheTuple(ATTNAME,
+ ObjectIdGetDatum(relId),
+ PointerGetDatum(attribute->name),
+ 0, 0);
+ if (!HeapTupleIsValid(tuple))
+ {
+ elog(WARN,
+ "DefineIndex: attribute \"%s\" not found",
+ attribute->name);
+ }
+
+ attform = (AttributeTupleForm) GETSTRUCT(tuple);
+ *attNumP++ = attform->attnum;
+
+ if (attribute->class == NULL)
+ {
+ /* no operator class specified, so find the default */
+ attribute->class = GetDefaultOpClass(attform->atttypid);
+ if (attribute->class == NULL)
+ {
+ elog(WARN,
+ "Can't find a default operator class for type %d.",
+ attform->atttypid);
+ }
+ }
+
+ tuple = SearchSysCacheTuple(CLANAME,
+ PointerGetDatum(attribute->class),
+ 0, 0, 0);
+
+ if (!HeapTupleIsValid(tuple))
+ {
+ elog(WARN, "DefineIndex: %s class not found",
+ attribute->class);
+ }
+ *opOidP++ = tuple->t_oid;
}
- *opOidP++ = tuple->t_oid;
- }
}
-static char *
+static char *
GetDefaultOpClass(Oid atttypid)
{
- HeapTuple tuple;
+ HeapTuple tuple;
- tuple = SearchSysCacheTuple(CLADEFTYPE,
- ObjectIdGetDatum(atttypid),
- 0, 0, 0);
- if(!HeapTupleIsValid(tuple)) {
- return 0;
- }
+ tuple = SearchSysCacheTuple(CLADEFTYPE,
+ ObjectIdGetDatum(atttypid),
+ 0, 0, 0);
+ if (!HeapTupleIsValid(tuple))
+ {
+ return 0;
+ }
- return nameout(&(((Form_pg_opclass)GETSTRUCT(tuple))->opcname));
+ return nameout(&(((Form_pg_opclass) GETSTRUCT(tuple))->opcname));
}
/*
* RemoveIndex --
- * Deletes an index.
+ * Deletes an index.
*
* Exceptions:
- * BadArg if name is invalid.
- * "WARN" if index nonexistent.
- * ...
+ * BadArg if name is invalid.
+ * "WARN" if index nonexistent.
+ * ...
*/
void
RemoveIndex(char *name)
{
- HeapTuple tuple;
-
- tuple = SearchSysCacheTuple(RELNAME,
- PointerGetDatum(name),
- 0,0,0);
-
- if (!HeapTupleIsValid(tuple)) {
- elog(WARN, "index \"%s\" nonexistent", name);
- }
-
- if (((Form_pg_class)GETSTRUCT(tuple))->relkind != RELKIND_INDEX) {
- elog(WARN, "relation \"%s\" is of type \"%c\"",
- name,
- ((Form_pg_class)GETSTRUCT(tuple))->relkind);
- }
-
- index_destroy(tuple->t_oid);
+ HeapTuple tuple;
+
+ tuple = SearchSysCacheTuple(RELNAME,
+ PointerGetDatum(name),
+ 0, 0, 0);
+
+ if (!HeapTupleIsValid(tuple))
+ {
+ elog(WARN, "index \"%s\" nonexistent", name);
+ }
+
+ if (((Form_pg_class) GETSTRUCT(tuple))->relkind != RELKIND_INDEX)
+ {
+ elog(WARN, "relation \"%s\" is of type \"%c\"",
+ name,
+ ((Form_pg_class) GETSTRUCT(tuple))->relkind);
+ }
+
+ index_destroy(tuple->t_oid);
}