]> granicus.if.org Git - postgresql/commitdiff
Fixes a bug in 'create index'
authorMarc G. Fournier <scrappy@hub.org>
Thu, 15 Aug 1996 07:42:52 +0000 (07:42 +0000)
committerMarc G. Fournier <scrappy@hub.org>
Thu, 15 Aug 1996 07:42:52 +0000 (07:42 +0000)
Submitted by: Dan McGuirk <mcguirk@indirect.com>

src/backend/catalog/pg_amop.h
src/backend/catalog/pg_amproc.h
src/backend/catalog/pg_opclass.h
src/backend/commands/defind.c
src/backend/parser/gram.y
src/backend/utils/cache/syscache.c
src/backend/utils/syscache.h

index f749790e24a6dbe03548e8a1b2c121e94691a507..7c0ab29e0ba01f36681cd83d03a9fce4359f3c84 100644 (file)
@@ -7,7 +7,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_amop.h,v 1.2 1996/07/20 08:19:11 scrappy Exp $
+ * $Id: pg_amop.h,v 1.3 1996/08/15 07:42:06 scrappy Exp $
  *
  * NOTES
  *   the genbki.sh script reads this file and generates .bki
@@ -219,11 +219,11 @@ DATA(insert OID = 0 (  403 408 462 5 btreesel btreenpage ));
  *  nbtree name_ops
  */
 
-DATA(insert OID = 0 (  403 409 660 1 btreesel btreenpage ));
-DATA(insert OID = 0 (  403 409 661 2 btreesel btreenpage ));
-DATA(insert OID = 0 (  403 409 93 3 btreesel btreenpage ));
-DATA(insert OID = 0 (  403 409 663 4 btreesel btreenpage ));
-DATA(insert OID = 0 (  403 409 662 5 btreesel btreenpage ));
+DATA(insert OID = 0 (  403 1181 660 1 btreesel btreenpage ));
+DATA(insert OID = 0 (  403 1181 661 2 btreesel btreenpage ));
+DATA(insert OID = 0 (  403 1181 93 3 btreesel btreenpage ));
+DATA(insert OID = 0 (  403 1181 663 4 btreesel btreenpage ));
+DATA(insert OID = 0 (  403 1181 662 5 btreesel btreenpage ));
 
 /*
  *  nbtree char16_ops
@@ -453,11 +453,11 @@ DATA(insert OID = 0 (  404 430 647 5 btreesel btreenpage ));
  *  nobtree name_ops
  */
 
-DATA(insert OID = 0 (  404 409 660 1 btreesel btreenpage ));
-DATA(insert OID = 0 (  404 409 661 2 btreesel btreenpage ));
-DATA(insert OID = 0 (  404 409 93 3 btreesel btreenpage ));
-DATA(insert OID = 0 (  404 409 663 4 btreesel btreenpage ));
-DATA(insert OID = 0 (  404 409 662 5 btreesel btreenpage ));
+DATA(insert OID = 0 (  404 1181 660 1 btreesel btreenpage ));
+DATA(insert OID = 0 (  404 1181 661 2 btreesel btreenpage ));
+DATA(insert OID = 0 (  404 1181 93 3 btreesel btreenpage ));
+DATA(insert OID = 0 (  404 1181 663 4 btreesel btreenpage ));
+DATA(insert OID = 0 (  404 1181 662 5 btreesel btreenpage ));
 
 /*
  *  nobtree text_ops
@@ -526,7 +526,7 @@ DATA(insert OID = 0 (  405 430 99 1 hashsel hashnpage ));
 /*
  *  hash table name_ops
  */
-DATA(insert OID = 0 (  405 409 93 1 hashsel hashnpage ));
+DATA(insert OID = 0 (  405 1181 93 1 hashsel hashnpage ));
 /*
  *  hash table text_ops
  */
index 8cc85793d1be8816de58df7ffe7cd344deba8ecd..5e20cf57dd29eb85b14a813b588a2bf783b80fc4 100644 (file)
@@ -9,7 +9,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_amproc.h,v 1.2 1996/07/20 08:19:13 scrappy Exp $
+ * $Id: pg_amproc.h,v 1.3 1996/08/15 07:42:07 scrappy Exp $
  *
  * NOTES
  *    the genbki.sh script reads this file and generates .bki
@@ -82,7 +82,7 @@ DATA(insert OID = 0 (403 429 358 1));
 DATA(insert OID = 0 (403 406 689 1));
 DATA(insert OID = 0 (403 407 690 1));
 DATA(insert OID = 0 (403 408 691 1));
-DATA(insert OID = 0 (403 409 359 1));
+DATA(insert OID = 0 (403 1181 359 1));
 DATA(insert OID = 0 (403 430 374 1));
 DATA(insert OID = 0 (403 431 360 1));
 DATA(insert OID = 0 (403 432 357 1));
@@ -108,7 +108,7 @@ DATA(insert OID = 0 (404 429 358 1));
 DATA(insert OID = 0 (404 406 689 1));
 DATA(insert OID = 0 (404 407 690 1));
 DATA(insert OID = 0 (404 408 691 1));
-DATA(insert OID = 0 (404 409 359 1));
+DATA(insert OID = 0 (404 1181 359 1));
 DATA(insert OID = 0 (404 430 374 1));
 DATA(insert OID = 0 (404 431 360 1));
 DATA(insert OID = 0 (404 432 357 1));
@@ -125,7 +125,7 @@ DATA(insert OID = 0 (405 429 454 1));
 DATA(insert OID = 0 (405 406 692 1));
 DATA(insert OID = 0 (405 407 693 1));
 DATA(insert OID = 0 (405 408 694 1));
-DATA(insert OID = 0 (405 409 455 1));
+DATA(insert OID = 0 (405 1181 455 1));
 DATA(insert OID = 0 (405 430 499 1));
 DATA(insert OID = 0 (405 431 456 1));
 DATA(insert OID = 0 (405 1076 1080 1));
index 46aecd35c6204459532795b48e033e9f8f8486b9..d77d73369502e5b2fbb4cd6717a679fc7ecd52db 100644 (file)
@@ -7,7 +7,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_opclass.h,v 1.1.1.1 1996/07/09 06:21:17 scrappy Exp $
+ * $Id: pg_opclass.h,v 1.2 1996/08/15 07:42:09 scrappy Exp $
  *
  * NOTES
  *    the genbki.sh script reads this file and generates .bki
@@ -34,6 +34,7 @@
 
 CATALOG(pg_opclass) {
     NameData opcname;
+    Oid opcdeftype;
 } FormData_pg_opclass;
 
 /* ----------------
@@ -47,39 +48,46 @@ typedef FormData_pg_opclass *Form_pg_opclass;
  *     compiler constants for pg_opclass
  * ----------------
  */
-#define Natts_pg_opclass               1
+#define Natts_pg_opclass               2
 #define Anum_pg_opclass_opcname                1
+#define Anum_pg_opclass_opcdeftype      2
 
 /* ----------------
  *     initial contents of pg_opclass
  * ----------------
  */
 
-DATA(insert OID = 406 (    char2_ops ));
-DATA(insert OID = 407 (    char4_ops ));
-DATA(insert OID = 408 (    char8_ops ));
-DATA(insert OID = 409 (    name_ops ));
-DATA(insert OID = 421 (    int2_ops ));
-DATA(insert OID = 422 (    box_ops ));
-DATA(insert OID = 423 (    float8_ops ));
-DATA(insert OID = 424 (    int24_ops ));
-DATA(insert OID = 425 (    int42_ops ));
-DATA(insert OID = 426 (    int4_ops ));
+/*
+ * putting _null_'s in the (fixed-length) type field is bad
+ * (see the README in this directory), so just put zeros
+ * in, which are invalid OID's anyway.  --djm
+ */
+DATA(insert OID = 406  (    char2_ops      409    ));
+DATA(insert OID = 407  (    char4_ops      410    ));
+DATA(insert OID = 408  (    char8_ops      411    ));
+/* OID 409 is already used in table pg_type--this one should be unused */
+DATA(insert OID = 1181 (    name_ops       19     ));
+DATA(insert OID = 421  (    int2_ops       21     ));
+DATA(insert OID = 422  (    box_ops        603    ));
+DATA(insert OID = 423  (    float8_ops     701    ));
+DATA(insert OID = 424  (    int24_ops      0      ));
+DATA(insert OID = 425  (    int42_ops      0      ));
+DATA(insert OID = 426  (    int4_ops       23     ));
 #define INT4_OPS_OID 426
-DATA(insert OID = 427 (    oid_ops ));
-DATA(insert OID = 428 (    float4_ops ));
-DATA(insert OID = 429 (    char_ops ));
-DATA(insert OID = 430 (    char16_ops ));
-DATA(insert OID = 431 (    text_ops ));
-DATA(insert OID = 432 (    abstime_ops ));
-DATA(insert OID = 433 (    bigbox_ops));
-DATA(insert OID = 434 (    poly_ops));
-DATA(insert OID = 435 (    oidint4_ops));
-DATA(insert OID = 436 (    oidname_ops));
-DATA(insert OID = 437 (    oidint2_ops));
-DATA(insert OID = 1076 (   bpchar_ops));
-DATA(insert OID = 1077 (   varchar_ops));
-DATA(insert OID = 1114 (   date_ops));
-DATA(insert OID = 1115 (   time_ops));
+DATA(insert OID = 427  (    oid_ops        26     ));
+DATA(insert OID = 428  (    float4_ops     700    ));
+DATA(insert OID = 429  (    char_ops       18     ));
+DATA(insert OID = 430  (    char16_ops     20     ));
+DATA(insert OID = 431  (    text_ops       25     ));
+DATA(insert OID = 432  (    abstime_ops    702    ));
+DATA(insert OID = 433  (    bigbox_ops     0      ));
+DATA(insert OID = 434  (    poly_ops       604    ));
+DATA(insert OID = 435  (    oidint4_ops    910    ));
+DATA(insert OID = 436  (    oidname_ops    911    ));
+DATA(insert OID = 437  (    oidint2_ops    810    ));
+DATA(insert OID = 1076 (    bpchar_ops     1042   ));
+DATA(insert OID = 1077 (    varchar_ops    1043   ));
+DATA(insert OID = 1114 (    date_ops       1082   ));
+DATA(insert OID = 1115 (    time_ops       1083   ));
 
 #endif /* PG_OPCLASS_H */
index da797e23cbbe6327bb87f7646cd68608cacbf066..22e971829eaa36684d245ec65e84fdde0819cb69 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/commands/Attic/defind.c,v 1.1.1.1 1996/07/09 06:21:20 scrappy Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/commands/Attic/defind.c,v 1.2 1996/08/15 07:42:19 scrappy Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -23,6 +23,7 @@
 #include "catalog/index.h"
 #include "catalog/pg_index.h"
 #include "catalog/pg_proc.h"
+#include "catalog/pg_opclass.h"
 #include "nodes/pg_list.h"
 #include "nodes/plannodes.h"
 #include "nodes/primnodes.h"
@@ -51,6 +52,7 @@ 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 --
@@ -439,14 +441,10 @@ NormIndexAttrs(List *attList,             /* list of IndexElem's */
     
     for (rest=attList; rest != NIL; rest = lnext(rest)) {
        IndexElem *attribute;
+       AttributeTupleForm attform;
        
        attribute = lfirst(rest);
        
-       if (attribute->class == NULL) {
-           elog(WARN,
-                "DefineIndex: default index class unsupported");
-       }
-       
        if (attribute->name == NULL)
            elog(WARN, "missing attribute for define index");
        
@@ -459,7 +457,19 @@ NormIndexAttrs(List *attList,              /* list of IndexElem's */
                 "DefineIndex: attribute \"%s\" not found",
                 attribute->name);
        }
-       *attNumP++ = ((AttributeTupleForm)GETSTRUCT(tuple))->attnum;
+
+       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),
@@ -473,6 +483,21 @@ NormIndexAttrs(List *attList,              /* list of IndexElem's */
     }
 }
 
+static char *
+GetDefaultOpClass(Oid atttypid)
+{
+    HeapTuple tuple;
+
+    tuple = SearchSysCacheTuple(CLADEFTYPE,
+                               ObjectIdGetDatum(atttypid),
+                               0, 0, 0);
+    if(!HeapTupleIsValid(tuple)) {
+       return 0;
+    }
+
+    return nameout(&(((Form_pg_opclass)GETSTRUCT(tuple))->opcname));
+}
+
 /*
  * RemoveIndex --
  *     Deletes an index.
index 517c1a64edf6cdab5830124ae4f163ad86122200..b5c80f971ccf867d2a64fcf80d58779950c6cbe1 100644 (file)
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.6 1996/08/13 01:29:33 scrappy Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.7 1996/08/15 07:42:29 scrappy Exp $
  *
  * HISTORY
  *    AUTHOR           DATE            MAJOR EVENT
@@ -109,8 +109,8 @@ static Node *makeA_Expr(int op, char *opname, Node *lexpr, Node *rexpr);
        ExplainStmt
 
 %type <str>    relation_name, copy_file_name, copy_delimiter, def_name,
-       database_name, access_method, attr_name, class, index_name,
-       var_name, name, file_name, recipe_name
+       database_name, access_method_clause, access_method, attr_name,
+       class, index_name, var_name, name, file_name, recipe_name
 
 %type <str>    opt_id, opt_portal_name,
        before_clause, after_clause, all_Op, MathOp, opt_name, opt_unique
@@ -653,21 +653,25 @@ opt_portal_name: IN name                  { $$ = $2;}
  *****************************************************************************/
 
 IndexStmt:  CREATE INDEX index_name ON relation_name
-           USING access_method '(' index_params ')'
+           access_method_clause '(' index_params ')'
                {
                    /* should check that access_method is valid,
                       etc ... but doesn't */
                    IndexStmt *n = makeNode(IndexStmt);
                    n->idxname = $3;
                    n->relname = $5;
-                   n->accessMethod = $7;
-                   n->indexParams = $9;
+                   n->accessMethod = $6;
+                   n->indexParams = $8;
                    n->withClause = NIL;
                    n->whereClause = NULL;
                    $$ = (Node *)n;
                }
        ;
 
+access_method_clause:   USING access_method      { $$ = $2; }
+                     | /* empty -- 'btree' is default access method */
+                                                { $$ = "btree"; }
+
 /*****************************************************************************
  *
  *     QUERY:
index 36b46d9b99e272e151e90ca6db253c6526412e6f..8c90db09d0d3249f0a39edcc5adabd5355f1425e 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/utils/cache/syscache.c,v 1.1.1.1 1996/07/09 06:22:07 scrappy Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/utils/cache/syscache.c,v 1.2 1996/08/15 07:42:52 scrappy Exp $
  *
  * NOTES
  *    These routines allow the parser/planner/executor to perform
@@ -304,7 +304,16 @@ static struct cachedesc cacheinfo[] = {
                  0 },
           offsetof(FormData_pg_proc, prosrc),
       ProcedureSrcIndex,
-      (ScanFunc) ProcedureSrcIndexScan  }
+      (ScanFunc) ProcedureSrcIndexScan  },
+    { OperatorClassRelationName,               /* CLADEFTYPE */
+          1,
+          { Anum_pg_opclass_opcdeftype,
+                  0,
+                  0,
+                  0 },
+          sizeof(FormData_pg_opclass),
+           NULL,
+           (ScanFunc) NULL   }
 };
  
 static struct catcache *SysCache[lengthof(cacheinfo)];
index beea596940429b4291708a8efe2a259d78ec1937..63ea61f03849a6c377e791a0bc84ce4d5b2849bd 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: syscache.h,v 1.1.1.1 1996/07/09 06:22:02 scrappy Exp $
+ * $Id: syscache.h,v 1.2 1996/08/15 07:42:45 scrappy Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -58,6 +58,7 @@
 #define GROSYSID       24
 #define        REWRITENAME     25
 #define PROSRC          26
+#define CLADEFTYPE      27
 
 /* ----------------
  *     struct cachedesc:       information needed for a call to InitSysCache()