]> granicus.if.org Git - postgresql/commitdiff
Fix index_create for multi-column indices
authorVadim B. Mikheev <vadim4o@yahoo.com>
Wed, 19 Mar 1997 07:44:45 +0000 (07:44 +0000)
committerVadim B. Mikheev <vadim4o@yahoo.com>
Wed, 19 Mar 1997 07:44:45 +0000 (07:44 +0000)
src/backend/catalog/index.c

index 843a1d55e5c630ddde0d968ae4cb71d37f55cf33..1ef5569bcb97fe3f08505514ff521a81a4b44305 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.11 1997/01/10 09:51:38 vadim Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.12 1997/03/19 07:44:45 vadim Exp $
  *
  *
  * INTERFACE ROUTINES
@@ -68,7 +68,7 @@ static Oid RelationNameGetObjectId(char *relationName, Relation pg_class,
 static Oid GetHeapRelationOid(char *heapRelationName, char *indexRelationName);
 static TupleDesc BuildFuncTupleDesc(FuncIndexInfo *funcInfo);
 static TupleDesc ConstructTupleDescriptor(Oid heapoid, Relation heapRelation,
-                                         TypeName *IndexKeyType,
+                                         List *attributeList,
                                          int numatts, AttrNumber attNums[]);
 
 static void ConstructIndexReldesc(Relation indexRelation, Oid amoid);
@@ -81,7 +81,7 @@ AppendAttributeTuples(Relation indexRelation, int numatts);
 static void UpdateIndexRelation(Oid indexoid, Oid heapoid,
        FuncIndexInfo *funcInfo, int natts,
        AttrNumber attNums[], Oid classOids[], Node *predicate,
-       TypeName *indexKeyType, bool islossy, bool unique);
+       List *attributeList, bool islossy, bool unique);
 static void DefaultBuild(Relation heapRelation, Relation indexRelation,
        int numberOfAttributes, AttrNumber attributeNumber[],
        IndexStrategy indexStrategy, uint16 parameterCount,
@@ -325,12 +325,14 @@ BuildFuncTupleDesc(FuncIndexInfo *funcInfo)
 static TupleDesc
 ConstructTupleDescriptor(Oid heapoid,
                         Relation heapRelation,
-                        TypeName *IndexKeyType,
+                        List *attributeList,
                         int numatts,
                         AttrNumber attNums[])
 {
     TupleDesc  heapTupDesc;
     TupleDesc  indexTupDesc;
+    IndexElem *IndexKey;
+    TypeName *IndexKeyType;
     AttrNumber         atnum;          /* attributeNumber[attributeOffset] */
     AttrNumber         atind;
     int        natts;          /* RelationTupleForm->relnatts */
@@ -367,6 +369,9 @@ ConstructTupleDescriptor(Oid heapoid,
        if (atnum > natts)
            elog(WARN, "Cannot create index: attribute %d does not exist",
                 atnum);
+       IndexKey = (IndexElem*) lfirst(attributeList);
+       attributeList = lnext(attributeList);
+       IndexKeyType = IndexKey->tname;
        
        indexTupDesc->attrs[i] = (AttributeTupleForm) palloc(ATTRIBUTE_TUPLE_SIZE);
        
@@ -693,7 +698,7 @@ AppendAttributeTuples(Relation indexRelation, int numatts)
         */
        memmove(GETSTRUCT(tuple),
               (char *)indexTupDesc->attrs[i],
-              sizeof (AttributeTupleForm));
+              sizeof (FormData_pg_attribute));
        
        value[ Anum_pg_attribute_attnum - 1 ] = Int16GetDatum(i + 1);
        
@@ -741,11 +746,12 @@ UpdateIndexRelation(Oid indexoid,
                    AttrNumber attNums[],
                    Oid classOids[],
                    Node *predicate,
-                   TypeName *indexKeyType,
+                   List *attributeList,
                    bool islossy,
                    bool unique)
 {
     IndexTupleForm     indexForm;
+    IndexElem *IndexKey;
     char               *predString;
     text               *predText;
     int                        predLen, itupLen;
@@ -781,10 +787,18 @@ UpdateIndexRelation(Oid indexoid,
        FIgetProcOid(funcInfo) : InvalidOid;
     indexForm->indislossy = islossy;
     indexForm->indisunique = unique;
-    if (indexKeyType != NULL)
-        indexForm->indhaskeytype = 1;
-    else
-        indexForm->indhaskeytype = 0;
+
+    indexForm->indhaskeytype = 0;
+    while (attributeList != NIL )
+    {
+       IndexKey = (IndexElem*) lfirst(attributeList);
+       if ( IndexKey->tname != NULL )
+       {
+           indexForm->indhaskeytype = 1;
+           break;
+       }
+       attributeList = lnext(attributeList);
+    }
     
     memset((char *)& indexForm->indkey[0], 0, sizeof indexForm->indkey);
     memset((char *)& indexForm->indclass[0], 0, sizeof indexForm->indclass);
@@ -1002,7 +1016,7 @@ void
 index_create(char *heapRelationName,
             char *indexRelationName,
             FuncIndexInfo *funcInfo,
-            TypeName *IndexKeyType,
+            List *attributeList,
             Oid accessMethodObjectId,
             int numatts,
             AttrNumber attNums[],
@@ -1052,7 +1066,7 @@ index_create(char *heapRelationName,
     else
        indexTupDesc = ConstructTupleDescriptor(heapoid,
                                                heapRelation,
-                                               IndexKeyType,
+                                               attributeList,
                                                numatts,
                                                attNums);
     
@@ -1125,7 +1139,7 @@ index_create(char *heapRelationName,
      */
     UpdateIndexRelation(indexoid, heapoid, funcInfo,
                        numatts, attNums, classObjectId, predicate,
-                       IndexKeyType, islossy, unique);
+                       attributeList, islossy, unique);
     
     predInfo = (PredInfo*)palloc(sizeof(PredInfo));
     predInfo->pred = predicate;