Remove grammar restrictions on order of optional clauses in CREATE GROUP.

From Vince Vielhaber.
This commit is contained in:
Tom Lane 2001-07-12 18:03:00 +00:00
parent 5c4d1398a6
commit 3284758a17
7 changed files with 129 additions and 84 deletions

View File

@ -1,5 +1,5 @@
<!-- <!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_group.sgml,v 1.2 2000/03/27 17:14:42 thomas Exp $ $Header: /cvsroot/pgsql/doc/src/sgml/ref/create_group.sgml,v 1.3 2001/07/12 18:02:58 tgl Exp $
Postgres documentation Postgres documentation
--> -->
@ -23,10 +23,12 @@ Postgres documentation
<date>2000-01-14</date> <date>2000-01-14</date>
</refsynopsisdivinfo> </refsynopsisdivinfo>
<synopsis> <synopsis>
CREATE GROUP <replaceable class="PARAMETER">name</replaceable> CREATE GROUP <replaceable class="PARAMETER">name</replaceable> [ [ WITH ] <replaceable class="PARAMETER">option</replaceable> [ ... ] ]
[ WITH
[ SYSID <replaceable class="PARAMETER">gid</replaceable> ] where <replaceable class="PARAMETER">option</replaceable> can be:
[ USER <replaceable class="PARAMETER">username</replaceable> [, ...] ] ]
SYSID <replaceable class="PARAMETER">gid</replaceable>
| USER <replaceable class="PARAMETER">username</replaceable> [, ...]
</synopsis> </synopsis>
<refsect2 id="R2-SQL-CREATEGROUP-1"> <refsect2 id="R2-SQL-CREATEGROUP-1">

View File

@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $Header: /cvsroot/pgsql/src/backend/commands/user.c,v 1.78 2001/07/10 22:09:28 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/commands/user.c,v 1.79 2001/07/12 18:02:59 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -787,13 +787,47 @@ CreateGroup(CreateGroupStmt *stmt)
HeapTuple tuple; HeapTuple tuple;
TupleDesc pg_group_dsc; TupleDesc pg_group_dsc;
bool group_exists = false, bool group_exists = false,
sysid_exists = false; sysid_exists = false,
havesysid = false;
int max_id = 0; int max_id = 0;
Datum new_record[Natts_pg_group]; Datum new_record[Natts_pg_group];
char new_record_nulls[Natts_pg_group]; char new_record_nulls[Natts_pg_group];
List *item, List *item,
*newlist = NULL; *option,
*newlist = NIL;
ArrayType *userarray; ArrayType *userarray;
int sysid = 0;
List *userElts = NIL;
DefElem *dsysid = NULL;
DefElem *duserElts = NULL;
foreach(option, stmt->options)
{
DefElem *defel = (DefElem *) lfirst(option);
if (strcasecmp(defel->defname, "sysid") == 0) {
if (dsysid)
elog(ERROR, "CREATE GROUP: conflicting options");
dsysid = defel;
}
else if (strcasecmp(defel->defname, "userElts") == 0) {
if (duserElts)
elog(ERROR, "CREATE GROUP: conflicting options");
duserElts = defel;
}
else
elog(ERROR,"CREATE GROUP: option \"%s\" not recognized",
defel->defname);
}
if (dsysid)
{
sysid = intVal(dsysid->arg);
havesysid = true;
}
if (duserElts)
userElts = (List *) duserElts->arg;
/* /*
* Make sure the user can do this. * Make sure the user can do this.
@ -819,8 +853,8 @@ CreateGroup(CreateGroupStmt *stmt)
datum = heap_getattr(tuple, Anum_pg_group_grosysid, datum = heap_getattr(tuple, Anum_pg_group_grosysid,
pg_group_dsc, &null); pg_group_dsc, &null);
Assert(!null); Assert(!null);
if (stmt->sysid >= 0) /* customized id wanted */ if (havesysid) /* customized id wanted */
sysid_exists = (DatumGetInt32(datum) == stmt->sysid); sysid_exists = (DatumGetInt32(datum) == sysid);
else else
{ {
/* pick 1 + max */ /* pick 1 + max */
@ -835,19 +869,19 @@ CreateGroup(CreateGroupStmt *stmt)
stmt->name); stmt->name);
if (sysid_exists) if (sysid_exists)
elog(ERROR, "CREATE GROUP: group sysid %d is already assigned", elog(ERROR, "CREATE GROUP: group sysid %d is already assigned",
stmt->sysid); sysid);
/* /*
* Translate the given user names to ids * Translate the given user names to ids
*/ */
foreach(item, stmt->initUsers) foreach(item, userElts)
{ {
const char *groupuser = strVal(lfirst(item)); const char *groupuser = strVal(lfirst(item));
Value *v; Value *v;
v = makeInteger(get_usesysid(groupuser)); v = makeInteger(get_usesysid(groupuser));
if (!member(v, newlist)) if (!member(v, newlist))
newlist = lcons(v, newlist); newlist = lappend(newlist, v);
} }
/* build an array to insert */ /* build an array to insert */
@ -872,14 +906,12 @@ CreateGroup(CreateGroupStmt *stmt)
/* /*
* Form a tuple to insert * Form a tuple to insert
*/ */
if (stmt->sysid >= 0) if (!havesysid)
max_id = stmt->sysid; sysid = max_id + 1;
else
max_id++;
new_record[Anum_pg_group_groname - 1] = new_record[Anum_pg_group_groname - 1] =
DirectFunctionCall1(namein, CStringGetDatum(stmt->name)); DirectFunctionCall1(namein, CStringGetDatum(stmt->name));
new_record[Anum_pg_group_grosysid - 1] = Int32GetDatum(max_id); new_record[Anum_pg_group_grosysid - 1] = Int32GetDatum(sysid);
new_record[Anum_pg_group_grolist - 1] = PointerGetDatum(userarray); new_record[Anum_pg_group_grolist - 1] = PointerGetDatum(userarray);
new_record_nulls[Anum_pg_group_groname - 1] = ' '; new_record_nulls[Anum_pg_group_groname - 1] = ' ';
@ -952,7 +984,7 @@ AlterGroup(AlterGroupStmt *stmt, const char *tag)
char new_record_nulls[Natts_pg_group]; char new_record_nulls[Natts_pg_group];
ArrayType *newarray, ArrayType *newarray,
*oldarray; *oldarray;
List *newlist = NULL, List *newlist = NIL,
*item; *item;
HeapTuple tuple; HeapTuple tuple;
bool null = false; bool null = false;
@ -976,7 +1008,7 @@ AlterGroup(AlterGroupStmt *stmt, const char *tag)
v = makeInteger(arrval); v = makeInteger(arrval);
/* filter out duplicates */ /* filter out duplicates */
if (!member(v, newlist)) if (!member(v, newlist))
newlist = lcons(v, newlist); newlist = lappend(newlist, v);
} }
/* /*
@ -1007,7 +1039,7 @@ AlterGroup(AlterGroupStmt *stmt, const char *tag)
} }
if (!member(v, newlist)) if (!member(v, newlist))
newlist = lcons(v, newlist); newlist = lappend(newlist, v);
else else
/* /*
* we silently assume here that this error will only come * we silently assume here that this error will only come
@ -1074,7 +1106,7 @@ AlterGroup(AlterGroupStmt *stmt, const char *tag)
char new_record_nulls[Natts_pg_group]; char new_record_nulls[Natts_pg_group];
ArrayType *oldarray, ArrayType *oldarray,
*newarray; *newarray;
List *newlist = NULL, List *newlist = NIL,
*item; *item;
int i; int i;
@ -1094,7 +1126,7 @@ AlterGroup(AlterGroupStmt *stmt, const char *tag)
v = makeInteger(arrval); v = makeInteger(arrval);
/* filter out duplicates */ /* filter out duplicates */
if (!member(v, newlist)) if (!member(v, newlist))
newlist = lcons(v, newlist); newlist = lappend(newlist, v);
} }
/* /*

View File

@ -15,7 +15,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.146 2001/07/10 22:09:28 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.147 2001/07/12 18:02:59 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -2462,8 +2462,7 @@ _copyCreateGroupStmt(CreateGroupStmt *from)
if (from->name) if (from->name)
newnode->name = pstrdup(from->name); newnode->name = pstrdup(from->name);
newnode->sysid = from->sysid; Node_Copy(from, newnode, options);
Node_Copy(from, newnode, initUsers);
return newnode; return newnode;
} }
@ -2476,7 +2475,6 @@ _copyAlterGroupStmt(AlterGroupStmt *from)
if (from->name) if (from->name)
newnode->name = pstrdup(from->name); newnode->name = pstrdup(from->name);
newnode->action = from->action; newnode->action = from->action;
newnode->sysid = from->sysid;
Node_Copy(from, newnode, listUsers); Node_Copy(from, newnode, listUsers);
return newnode; return newnode;

View File

@ -20,7 +20,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.94 2001/07/10 22:09:28 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.95 2001/07/12 18:02:59 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -1320,9 +1320,7 @@ _equalCreateGroupStmt(CreateGroupStmt *a, CreateGroupStmt *b)
{ {
if (!equalstr(a->name, b->name)) if (!equalstr(a->name, b->name))
return false; return false;
if (a->sysid != b->sysid) if (!equal(a->options, b->options))
return false;
if (!equal(a->initUsers, b->initUsers))
return false; return false;
return true; return true;
@ -1335,8 +1333,6 @@ _equalAlterGroupStmt(AlterGroupStmt *a, AlterGroupStmt *b)
return false; return false;
if (a->action != b->action) if (a->action != b->action)
return false; return false;
if (a->sysid != b->sysid)
return false;
if (!equal(a->listUsers, b->listUsers)) if (!equal(a->listUsers, b->listUsers))
return false; return false;

View File

@ -11,7 +11,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.235 2001/07/10 22:09:28 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.236 2001/07/12 18:02:59 tgl Exp $
* *
* HISTORY * HISTORY
* AUTHOR DATE MAJOR EVENT * AUTHOR DATE MAJOR EVENT
@ -155,7 +155,10 @@ static void doNegateFloat(Value *v);
%type <ival> opt_lock, lock_type %type <ival> opt_lock, lock_type
%type <boolean> opt_force %type <boolean> opt_force
%type <list> user_list, users_in_new_group_clause %type <list> user_list
%type <list> OptGroupList
%type <defelt> OptGroupElem
%type <list> OptUserList %type <list> OptUserList
%type <defelt> OptUserElem %type <defelt> OptUserElem
@ -489,19 +492,19 @@ stmt : AlterSchemaStmt
*****************************************************************************/ *****************************************************************************/
CreateUserStmt: CREATE USER UserId OptUserList CreateUserStmt: CREATE USER UserId OptUserList
{ {
CreateUserStmt *n = makeNode(CreateUserStmt); CreateUserStmt *n = makeNode(CreateUserStmt);
n->user = $3; n->user = $3;
n->options = $4; n->options = $4;
$$ = (Node *)n; $$ = (Node *)n;
} }
| CREATE USER UserId WITH OptUserList | CREATE USER UserId WITH OptUserList
{ {
CreateUserStmt *n = makeNode(CreateUserStmt); CreateUserStmt *n = makeNode(CreateUserStmt);
n->user = $3; n->user = $3;
n->options = $5; n->options = $5;
$$ = (Node *)n; $$ = (Node *)n;
} }
; ;
/***************************************************************************** /*****************************************************************************
@ -512,19 +515,19 @@ CreateUserStmt: CREATE USER UserId OptUserList
*****************************************************************************/ *****************************************************************************/
AlterUserStmt: ALTER USER UserId OptUserList AlterUserStmt: ALTER USER UserId OptUserList
{ {
AlterUserStmt *n = makeNode(AlterUserStmt); AlterUserStmt *n = makeNode(AlterUserStmt);
n->user = $3; n->user = $3;
n->options = $4; n->options = $4;
$$ = (Node *)n; $$ = (Node *)n;
} }
| ALTER USER UserId WITH OptUserList | ALTER USER UserId WITH OptUserList
{ {
AlterUserStmt *n = makeNode(AlterUserStmt); AlterUserStmt *n = makeNode(AlterUserStmt);
n->user = $3; n->user = $3;
n->options = $5; n->options = $5;
$$ = (Node *)n; $$ = (Node *)n;
} }
; ;
/***************************************************************************** /*****************************************************************************
@ -618,35 +621,43 @@ user_list: user_list ',' UserId
* *
*****************************************************************************/ *****************************************************************************/
CreateGroupStmt: CREATE GROUP UserId CreateGroupStmt: CREATE GROUP UserId OptGroupList
{ {
CreateGroupStmt *n = makeNode(CreateGroupStmt); CreateGroupStmt *n = makeNode(CreateGroupStmt);
n->name = $3; n->name = $3;
n->sysid = -1; n->options = $4;
n->initUsers = NIL;
$$ = (Node *)n; $$ = (Node *)n;
} }
| CREATE GROUP UserId WITH users_in_new_group_clause | CREATE GROUP UserId WITH OptGroupList
{ {
CreateGroupStmt *n = makeNode(CreateGroupStmt); CreateGroupStmt *n = makeNode(CreateGroupStmt);
n->name = $3; n->name = $3;
n->sysid = -1; n->options = $5;
n->initUsers = $5;
$$ = (Node *)n; $$ = (Node *)n;
} }
| CREATE GROUP UserId WITH SYSID Iconst users_in_new_group_clause
{
CreateGroupStmt *n = makeNode(CreateGroupStmt);
n->name = $3;
n->sysid = $6;
n->initUsers = $7;
$$ = (Node *)n;
}
; ;
users_in_new_group_clause: USER user_list { $$ = $2; } /*
| /* EMPTY */ { $$ = NIL; } * Options for CREATE GROUP
; */
OptGroupList: OptGroupList OptGroupElem { $$ = lappend($1, $2); }
| /* EMPTY */ { $$ = NIL; }
;
OptGroupElem: USER user_list
{
$$ = makeNode(DefElem);
$$->defname = "userElts";
$$->arg = (Node *)$2;
}
| SYSID Iconst
{
$$ = makeNode(DefElem);
$$->defname = "sysid";
$$->arg = (Node *)makeInteger($2);
}
;
/***************************************************************************** /*****************************************************************************
* *
@ -659,7 +670,6 @@ AlterGroupStmt: ALTER GROUP UserId ADD USER user_list
{ {
AlterGroupStmt *n = makeNode(AlterGroupStmt); AlterGroupStmt *n = makeNode(AlterGroupStmt);
n->name = $3; n->name = $3;
n->sysid = -1;
n->action = +1; n->action = +1;
n->listUsers = $6; n->listUsers = $6;
$$ = (Node *)n; $$ = (Node *)n;
@ -668,13 +678,13 @@ AlterGroupStmt: ALTER GROUP UserId ADD USER user_list
{ {
AlterGroupStmt *n = makeNode(AlterGroupStmt); AlterGroupStmt *n = makeNode(AlterGroupStmt);
n->name = $3; n->name = $3;
n->sysid = -1;
n->action = -1; n->action = -1;
n->listUsers = $6; n->listUsers = $6;
$$ = (Node *)n; $$ = (Node *)n;
} }
; ;
/***************************************************************************** /*****************************************************************************
* *
* Drop a postgresql group * Drop a postgresql group

View File

@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $Id: parsenodes.h,v 1.134 2001/07/10 22:09:29 tgl Exp $ * $Id: parsenodes.h,v 1.135 2001/07/12 18:03:00 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -365,8 +365,7 @@ typedef struct CreateGroupStmt
{ {
NodeTag type; NodeTag type;
char *name; /* name of the new group */ char *name; /* name of the new group */
int sysid; /* group id (-1 if pick default) */ List *options; /* List of DefElem nodes */
List *initUsers; /* list of initial users */
} CreateGroupStmt; } CreateGroupStmt;
typedef struct AlterGroupStmt typedef struct AlterGroupStmt
@ -374,7 +373,6 @@ typedef struct AlterGroupStmt
NodeTag type; NodeTag type;
char *name; /* name of group to alter */ char *name; /* name of group to alter */
int action; /* +1 = add, -1 = drop user */ int action; /* +1 = add, -1 = drop user */
int sysid; /* sysid change */
List *listUsers; /* list of users to add/drop */ List *listUsers; /* list of users to add/drop */
} AlterGroupStmt; } AlterGroupStmt;

View File

@ -331,7 +331,7 @@ make_name(void)
%type <str> select_clause opt_select_limit select_limit_value ConstraintTimeSpec %type <str> select_clause opt_select_limit select_limit_value ConstraintTimeSpec
%type <str> select_offset_value ReindexStmt join_type opt_boolean %type <str> select_offset_value ReindexStmt join_type opt_boolean
%type <str> join_qual update_list AlterSchemaStmt joined_table %type <str> join_qual update_list AlterSchemaStmt joined_table
%type <str> opt_level opt_lock lock_type users_in_new_group_clause %type <str> opt_level opt_lock lock_type OptGroupList OptGroupElem
%type <str> OptConstrFromTable comment_op OptTempTableName StringConst %type <str> OptConstrFromTable comment_op OptTempTableName StringConst
%type <str> constraints_set_list constraints_set_namelist comment_fn %type <str> constraints_set_list constraints_set_namelist comment_fn
%type <str> constraints_set_mode comment_type comment_cl comment_ag %type <str> constraints_set_mode comment_type comment_cl comment_ag
@ -691,23 +691,32 @@ user_list: user_list ',' UserId
* *
* *
****************************************************************************/ ****************************************************************************/
CreateGroupStmt: CREATE GROUP UserId CreateGroupStmt: CREATE GROUP UserId OptGroupList
{ {
$$ = cat2_str(make_str("create group"), $3); $$ = cat_str(3, make_str("create group"), $3, $4);
} }
| CREATE GROUP UserId WITH users_in_new_group_clause | CREATE GROUP UserId WITH OptGroupList
{ {
$$ = cat_str(4, make_str("create group"), $3, make_str("with"), $5); $$ = cat_str(4, make_str("create group"), $3, make_str("with"), $5);
} }
| CREATE GROUP UserId WITH SYSID Iconst users_in_new_group_clause ;
{
$$ = cat_str(5, make_str("create group"), $3, make_str("with sysid"), $6, $7);
}
;
users_in_new_group_clause: USER user_list { $$ = cat2_str(make_str("user"), $2); } /*
| /* EMPTY */ { $$ = EMPTY; } * Options for CREATE GROUP
; */
OptGroupList: OptGroupList OptGroupElem { $$ = cat2_str($1, $2); }
| /* EMPTY */ { $$ = EMPTY; }
;
OptGroupElem: USER user_list
{
$$ = cat2_str(make_str("user"), $2);
}
| SYSID Iconst
{
$$ = cat2_str(make_str("sysid"), $2);
}
;
/***************************************************************************** /*****************************************************************************