From e40492ec6edafb336005bbbf271eb76e04f58f8d Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 15 Jul 2000 00:01:41 +0000 Subject: [PATCH] Remove useless and dangerous 'opt_type' option from CREATE INDEX. --- src/backend/nodes/outfuncs.c | 10 ++++------ src/backend/parser/analyze.c | 3 +-- src/backend/parser/gram.y | 36 ++++++++++------------------------ src/include/nodes/parsenodes.h | 21 +++++++++++--------- 4 files changed, 27 insertions(+), 43 deletions(-) diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index 2999c4263b..f6fed84506 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.121 2000/07/12 02:37:06 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.122 2000/07/15 00:01:37 tgl Exp $ * * NOTES * Every (plan) node in POSTGRES has an associated "out" routine which @@ -139,9 +139,9 @@ _outIndexStmt(StringInfo str, IndexStmt *node) appendStringInfo(str, " :rangetable "); _outNode(str, node->rangetable); - appendStringInfo(str, " :lossy %s :unique %s ", - node->lossy ? "true" : "false", - node->unique ? "true" : "false"); + appendStringInfo(str, " :unique %s :primary %s ", + node->unique ? "true" : "false", + node->primary ? "true" : "false"); } static void @@ -210,8 +210,6 @@ _outIndexElem(StringInfo str, IndexElem *node) _outNode(str, node->args); appendStringInfo(str, " :class "); _outToken(str, node->class); - appendStringInfo(str, " :typename "); - _outNode(str, node->typename); } static void diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index 1d1cf7acf4..b5305edb54 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: analyze.c,v 1.150 2000/07/14 15:43:32 thomas Exp $ + * $Id: analyze.c,v 1.151 2000/07/15 00:01:41 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -947,7 +947,6 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt) iparam->name = pstrdup(column->colname); iparam->args = NIL; iparam->class = NULL; - iparam->typename = NULL; index->indexParams = lappend(index->indexParams, iparam); if (index->idxname == NULL) diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index cf1f15ba4e..16bac38748 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -11,7 +11,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.178 2000/07/14 15:43:32 thomas Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.179 2000/07/15 00:01:41 tgl Exp $ * * HISTORY * AUTHOR DATE MAJOR EVENT @@ -250,7 +250,7 @@ static void doNegateFloat(Value *v); %type target_el, update_target_el %type ParamNo -%type Typename, opt_type, SimpleTypename, ConstTypename +%type Typename, SimpleTypename, ConstTypename Generic, Numeric, Character, ConstDatetime, ConstInterval, Bit %type typename, generic, numeric, character, datetime, bit %type extract_arg @@ -1778,7 +1778,7 @@ TriggerFuncArg: ICONST } | FCONST { $$ = $1; } | Sconst { $$ = $1; } - | IDENT { $$ = $1; } + | ColId { $$ = $1; } ; OptConstrFromTable: /* Empty */ @@ -2315,8 +2315,6 @@ RevokeStmt: REVOKE privileges ON relation_name_list FROM grantee IndexStmt: CREATE index_opt_unique INDEX index_name ON relation_name access_method_clause '(' index_params ')' opt_with { - /* should check that access_method is valid, - etc ... but doesn't */ IndexStmt *n = makeNode(IndexStmt); n->unique = $2; n->idxname = $4; @@ -2345,37 +2343,24 @@ index_list: index_list ',' index_elem { $$ = lappend($1, $3); } | index_elem { $$ = lcons($1, NIL); } ; -func_index: func_name '(' name_list ')' opt_type opt_class +func_index: func_name '(' name_list ')' opt_class { $$ = makeNode(IndexElem); $$->name = $1; $$->args = $3; - $$->class = $6; - $$->typename = $5; + $$->class = $5; } ; -index_elem: attr_name opt_type opt_class +index_elem: attr_name opt_class { $$ = makeNode(IndexElem); $$->name = $1; $$->args = NIL; - $$->class = $3; - $$->typename = $2; + $$->class = $2; } ; -opt_type: ':' Typename { $$ = $2; } - | FOR Typename { $$ = $2; } - | /*EMPTY*/ { $$ = NULL; } - ; - -/* opt_class "WITH class" conflicts with preceeding opt_type - * for Typename of "TIMESTAMP WITH TIME ZONE" - * So, remove "WITH class" from the syntax. OK?? - * - thomas 1997-10-12 - * | WITH class { $$ = $2; } - */ opt_class: class { /* * Release 7.0 removed network_ops, timespan_ops, and datetime_ops, @@ -5352,9 +5337,9 @@ relation_name: SpecialRuleRelation ; database_name: ColId { $$ = $1; }; -access_method: IDENT { $$ = $1; }; +access_method: ColId { $$ = $1; }; attr_name: ColId { $$ = $1; }; -class: IDENT { $$ = $1; }; +class: ColId { $$ = $1; }; index_name: ColId { $$ = $1; }; /* Functions @@ -5365,7 +5350,6 @@ name: ColId { $$ = $1; }; func_name: ColId { $$ = xlateSqlFunc($1); }; file_name: Sconst { $$ = $1; }; -/* NOT USED recipe_name: IDENT { $$ = $1; };*/ /* Constants * Include TRUE/FALSE for SQL3 support. - thomas 1997-10-24 @@ -5453,7 +5437,7 @@ ParamNo: PARAM opt_indirection Iconst: ICONST { $$ = $1; }; Sconst: SCONST { $$ = $1; }; -UserId: IDENT { $$ = $1; }; +UserId: ColId { $$ = $1; }; /* Column identifier * Include date/time keywords as SQL92 extension. diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 388efc2ebd..8516da8800 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: parsenodes.h,v 1.109 2000/07/14 15:43:51 thomas Exp $ + * $Id: parsenodes.h,v 1.110 2000/07/15 00:01:38 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -467,13 +467,12 @@ typedef struct IndexStmt NodeTag type; char *idxname; /* name of the index */ char *relname; /* name of relation to index on */ - char *accessMethod; /* name of acess methood (eg. btree) */ + char *accessMethod; /* name of access method (eg. btree) */ List *indexParams; /* a list of IndexElem */ List *withClause; /* a list of DefElem */ - Node *whereClause; /* qualifications */ - List *rangetable; /* range table, filled in by + Node *whereClause; /* qualification (partial-index predicate) */ + List *rangetable; /* range table for qual, filled in by * transformStmt() */ - bool *lossy; /* is index lossy? */ bool unique; /* is index unique? */ bool primary; /* is index on primary key? */ } IndexStmt; @@ -1088,14 +1087,18 @@ typedef struct RangeVar /* * IndexElem - index parameters (used in CREATE INDEX) + * + * For a plain index, each 'name' is an attribute name in the heap relation, + * and 'args' is NIL. For a functional index, only one IndexElem is allowed. + * It has name = name of function and args = list of attribute names that + * are the function's arguments. */ typedef struct IndexElem { NodeTag type; - char *name; /* name of index */ - List *args; /* if not NULL, function index */ - char *class; - TypeName *typename; /* type of index's keys (optional) */ + char *name; /* name of attribute to index, or function */ + List *args; /* list of names of function arguments */ + char *class; /* name of desired opclass; NULL = default */ } IndexElem; /*