Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 3284758

Browse files
committed
Remove grammar restrictions on order of optional clauses in CREATE GROUP.
From Vince Vielhaber.
1 parent 5c4d139 commit 3284758

File tree

7 files changed

+126
-81
lines changed

7 files changed

+126
-81
lines changed

doc/src/sgml/ref/create_group.sgml

+7-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<!--
2-
$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_group.sgml,v 1.2 2000/03/27 17:14:42 thomas Exp $
2+
$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_group.sgml,v 1.3 2001/07/12 18:02:58 tgl Exp $
33
Postgres documentation
44
-->
55

@@ -23,10 +23,12 @@ Postgres documentation
2323
<date>2000-01-14</date>
2424
</refsynopsisdivinfo>
2525
<synopsis>
26-
CREATE GROUP <replaceable class="PARAMETER">name</replaceable>
27-
[ WITH
28-
[ SYSID <replaceable class="PARAMETER">gid</replaceable> ]
29-
[ USER <replaceable class="PARAMETER">username</replaceable> [, ...] ] ]
26+
CREATE GROUP <replaceable class="PARAMETER">name</replaceable> [ [ WITH ] <replaceable class="PARAMETER">option</replaceable> [ ... ] ]
27+
28+
where <replaceable class="PARAMETER">option</replaceable> can be:
29+
30+
SYSID <replaceable class="PARAMETER">gid</replaceable>
31+
| USER <replaceable class="PARAMETER">username</replaceable> [, ...]
3032
</synopsis>
3133

3234
<refsect2 id="R2-SQL-CREATEGROUP-1">

src/backend/commands/user.c

+50-18
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
77
* Portions Copyright (c) 1994, Regents of the University of California
88
*
9-
* $Header: /cvsroot/pgsql/src/backend/commands/user.c,v 1.78 2001/07/10 22:09:28 tgl Exp $
9+
* $Header: /cvsroot/pgsql/src/backend/commands/user.c,v 1.79 2001/07/12 18:02:59 tgl Exp $
1010
*
1111
*-------------------------------------------------------------------------
1212
*/
@@ -787,13 +787,47 @@ CreateGroup(CreateGroupStmt *stmt)
787787
HeapTuple tuple;
788788
TupleDesc pg_group_dsc;
789789
bool group_exists = false,
790-
sysid_exists = false;
790+
sysid_exists = false,
791+
havesysid = false;
791792
int max_id = 0;
792793
Datum new_record[Natts_pg_group];
793794
char new_record_nulls[Natts_pg_group];
794795
List *item,
795-
*newlist = NULL;
796+
*option,
797+
*newlist = NIL;
796798
ArrayType *userarray;
799+
int sysid = 0;
800+
List *userElts = NIL;
801+
DefElem *dsysid = NULL;
802+
DefElem *duserElts = NULL;
803+
804+
foreach(option, stmt->options)
805+
{
806+
DefElem *defel = (DefElem *) lfirst(option);
807+
808+
if (strcasecmp(defel->defname, "sysid") == 0) {
809+
if (dsysid)
810+
elog(ERROR, "CREATE GROUP: conflicting options");
811+
dsysid = defel;
812+
}
813+
else if (strcasecmp(defel->defname, "userElts") == 0) {
814+
if (duserElts)
815+
elog(ERROR, "CREATE GROUP: conflicting options");
816+
duserElts = defel;
817+
}
818+
else
819+
elog(ERROR,"CREATE GROUP: option \"%s\" not recognized",
820+
defel->defname);
821+
}
822+
823+
if (dsysid)
824+
{
825+
sysid = intVal(dsysid->arg);
826+
havesysid = true;
827+
}
828+
829+
if (duserElts)
830+
userElts = (List *) duserElts->arg;
797831

798832
/*
799833
* Make sure the user can do this.
@@ -819,8 +853,8 @@ CreateGroup(CreateGroupStmt *stmt)
819853
datum = heap_getattr(tuple, Anum_pg_group_grosysid,
820854
pg_group_dsc, &null);
821855
Assert(!null);
822-
if (stmt->sysid >= 0) /* customized id wanted */
823-
sysid_exists = (DatumGetInt32(datum) == stmt->sysid);
856+
if (havesysid) /* customized id wanted */
857+
sysid_exists = (DatumGetInt32(datum) == sysid);
824858
else
825859
{
826860
/* pick 1 + max */
@@ -835,19 +869,19 @@ CreateGroup(CreateGroupStmt *stmt)
835869
stmt->name);
836870
if (sysid_exists)
837871
elog(ERROR, "CREATE GROUP: group sysid %d is already assigned",
838-
stmt->sysid);
872+
sysid);
839873

840874
/*
841875
* Translate the given user names to ids
842876
*/
843-
foreach(item, stmt->initUsers)
877+
foreach(item, userElts)
844878
{
845879
const char *groupuser = strVal(lfirst(item));
846880
Value *v;
847881

848882
v = makeInteger(get_usesysid(groupuser));
849883
if (!member(v, newlist))
850-
newlist = lcons(v, newlist);
884+
newlist = lappend(newlist, v);
851885
}
852886

853887
/* build an array to insert */
@@ -872,14 +906,12 @@ CreateGroup(CreateGroupStmt *stmt)
872906
/*
873907
* Form a tuple to insert
874908
*/
875-
if (stmt->sysid >= 0)
876-
max_id = stmt->sysid;
877-
else
878-
max_id++;
909+
if (!havesysid)
910+
sysid = max_id + 1;
879911

880912
new_record[Anum_pg_group_groname - 1] =
881913
DirectFunctionCall1(namein, CStringGetDatum(stmt->name));
882-
new_record[Anum_pg_group_grosysid - 1] = Int32GetDatum(max_id);
914+
new_record[Anum_pg_group_grosysid - 1] = Int32GetDatum(sysid);
883915
new_record[Anum_pg_group_grolist - 1] = PointerGetDatum(userarray);
884916

885917
new_record_nulls[Anum_pg_group_groname - 1] = ' ';
@@ -952,7 +984,7 @@ AlterGroup(AlterGroupStmt *stmt, const char *tag)
952984
char new_record_nulls[Natts_pg_group];
953985
ArrayType *newarray,
954986
*oldarray;
955-
List *newlist = NULL,
987+
List *newlist = NIL,
956988
*item;
957989
HeapTuple tuple;
958990
bool null = false;
@@ -976,7 +1008,7 @@ AlterGroup(AlterGroupStmt *stmt, const char *tag)
9761008
v = makeInteger(arrval);
9771009
/* filter out duplicates */
9781010
if (!member(v, newlist))
979-
newlist = lcons(v, newlist);
1011+
newlist = lappend(newlist, v);
9801012
}
9811013

9821014
/*
@@ -1007,7 +1039,7 @@ AlterGroup(AlterGroupStmt *stmt, const char *tag)
10071039
}
10081040

10091041
if (!member(v, newlist))
1010-
newlist = lcons(v, newlist);
1042+
newlist = lappend(newlist, v);
10111043
else
10121044
/*
10131045
* we silently assume here that this error will only come
@@ -1074,7 +1106,7 @@ AlterGroup(AlterGroupStmt *stmt, const char *tag)
10741106
char new_record_nulls[Natts_pg_group];
10751107
ArrayType *oldarray,
10761108
*newarray;
1077-
List *newlist = NULL,
1109+
List *newlist = NIL,
10781110
*item;
10791111
int i;
10801112

@@ -1094,7 +1126,7 @@ AlterGroup(AlterGroupStmt *stmt, const char *tag)
10941126
v = makeInteger(arrval);
10951127
/* filter out duplicates */
10961128
if (!member(v, newlist))
1097-
newlist = lcons(v, newlist);
1129+
newlist = lappend(newlist, v);
10981130
}
10991131

11001132
/*

src/backend/nodes/copyfuncs.c

+2-4
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
* Portions Copyright (c) 1994, Regents of the University of California
1616
*
1717
* IDENTIFICATION
18-
* $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.146 2001/07/10 22:09:28 tgl Exp $
18+
* $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.147 2001/07/12 18:02:59 tgl Exp $
1919
*
2020
*-------------------------------------------------------------------------
2121
*/
@@ -2462,8 +2462,7 @@ _copyCreateGroupStmt(CreateGroupStmt *from)
24622462

24632463
if (from->name)
24642464
newnode->name = pstrdup(from->name);
2465-
newnode->sysid = from->sysid;
2466-
Node_Copy(from, newnode, initUsers);
2465+
Node_Copy(from, newnode, options);
24672466

24682467
return newnode;
24692468
}
@@ -2476,7 +2475,6 @@ _copyAlterGroupStmt(AlterGroupStmt *from)
24762475
if (from->name)
24772476
newnode->name = pstrdup(from->name);
24782477
newnode->action = from->action;
2479-
newnode->sysid = from->sysid;
24802478
Node_Copy(from, newnode, listUsers);
24812479

24822480
return newnode;

src/backend/nodes/equalfuncs.c

+2-6
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
* Portions Copyright (c) 1994, Regents of the University of California
2121
*
2222
* IDENTIFICATION
23-
* $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.94 2001/07/10 22:09:28 tgl Exp $
23+
* $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.95 2001/07/12 18:02:59 tgl Exp $
2424
*
2525
*-------------------------------------------------------------------------
2626
*/
@@ -1320,9 +1320,7 @@ _equalCreateGroupStmt(CreateGroupStmt *a, CreateGroupStmt *b)
13201320
{
13211321
if (!equalstr(a->name, b->name))
13221322
return false;
1323-
if (a->sysid != b->sysid)
1324-
return false;
1325-
if (!equal(a->initUsers, b->initUsers))
1323+
if (!equal(a->options, b->options))
13261324
return false;
13271325

13281326
return true;
@@ -1335,8 +1333,6 @@ _equalAlterGroupStmt(AlterGroupStmt *a, AlterGroupStmt *b)
13351333
return false;
13361334
if (a->action != b->action)
13371335
return false;
1338-
if (a->sysid != b->sysid)
1339-
return false;
13401336
if (!equal(a->listUsers, b->listUsers))
13411337
return false;
13421338

src/backend/parser/gram.y

+43-33
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
*
1212
*
1313
* IDENTIFICATION
14-
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.235 2001/07/10 22:09:28 tgl Exp $
14+
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.236 2001/07/12 18:02:59 tgl Exp $
1515
*
1616
* HISTORY
1717
* AUTHOR DATE MAJOR EVENT
@@ -155,7 +155,10 @@ static void doNegateFloat(Value *v);
155155
%type <ival> opt_lock, lock_type
156156
%type <boolean> opt_force
157157

158-
%type <list> user_list, users_in_new_group_clause
158+
%type <list> user_list
159+
160+
%type <list> OptGroupList
161+
%type <defelt> OptGroupElem
159162

160163
%type <list> OptUserList
161164
%type <defelt> OptUserElem
@@ -489,19 +492,19 @@ stmt : AlterSchemaStmt
489492
*****************************************************************************/
490493

491494
CreateUserStmt: CREATE USER UserId OptUserList
492-
{
495+
{
493496
CreateUserStmt *n = makeNode(CreateUserStmt);
494497
n->user = $3;
495498
n->options = $4;
496499
$$ = (Node *)n;
497-
}
498-
| CREATE USER UserId WITH OptUserList
499-
{
500+
}
501+
| CREATE USER UserId WITH OptUserList
502+
{
500503
CreateUserStmt *n = makeNode(CreateUserStmt);
501504
n->user = $3;
502505
n->options = $5;
503506
$$ = (Node *)n;
504-
}
507+
}
505508
;
506509

507510
/*****************************************************************************
@@ -512,19 +515,19 @@ CreateUserStmt: CREATE USER UserId OptUserList
512515
*****************************************************************************/
513516

514517
AlterUserStmt: ALTER USER UserId OptUserList
515-
{
518+
{
516519
AlterUserStmt *n = makeNode(AlterUserStmt);
517520
n->user = $3;
518521
n->options = $4;
519522
$$ = (Node *)n;
520-
}
521-
| ALTER USER UserId WITH OptUserList
522-
{
523+
}
524+
| ALTER USER UserId WITH OptUserList
525+
{
523526
AlterUserStmt *n = makeNode(AlterUserStmt);
524527
n->user = $3;
525528
n->options = $5;
526529
$$ = (Node *)n;
527-
}
530+
}
528531
;
529532

530533
/*****************************************************************************
@@ -618,35 +621,43 @@ user_list: user_list ',' UserId
618621
*
619622
*****************************************************************************/
620623

621-
CreateGroupStmt: CREATE GROUP UserId
622-
{
624+
CreateGroupStmt: CREATE GROUP UserId OptGroupList
625+
{
623626
CreateGroupStmt *n = makeNode(CreateGroupStmt);
624627
n->name = $3;
625-
n->sysid = -1;
626-
n->initUsers = NIL;
628+
n->options = $4;
627629
$$ = (Node *)n;
628-
}
629-
| CREATE GROUP UserId WITH users_in_new_group_clause
630-
{
630+
}
631+
| CREATE GROUP UserId WITH OptGroupList
632+
{
631633
CreateGroupStmt *n = makeNode(CreateGroupStmt);
632634
n->name = $3;
633-
n->sysid = -1;
634-
n->initUsers = $5;
635+
n->options = $5;
635636
$$ = (Node *)n;
637+
}
638+
;
639+
640+
/*
641+
* Options for CREATE GROUP
642+
*/
643+
OptGroupList: OptGroupList OptGroupElem { $$ = lappend($1, $2); }
644+
| /* EMPTY */ { $$ = NIL; }
645+
;
646+
647+
OptGroupElem: USER user_list
648+
{
649+
$$ = makeNode(DefElem);
650+
$$->defname = "userElts";
651+
$$->arg = (Node *)$2;
636652
}
637-
| CREATE GROUP UserId WITH SYSID Iconst users_in_new_group_clause
653+
| SYSID Iconst
638654
{
639-
CreateGroupStmt *n = makeNode(CreateGroupStmt);
640-
n->name = $3;
641-
n->sysid = $6;
642-
n->initUsers = $7;
643-
$$ = (Node *)n;
655+
$$ = makeNode(DefElem);
656+
$$->defname = "sysid";
657+
$$->arg = (Node *)makeInteger($2);
644658
}
645-
;
659+
;
646660

647-
users_in_new_group_clause: USER user_list { $$ = $2; }
648-
| /* EMPTY */ { $$ = NIL; }
649-
;
650661

651662
/*****************************************************************************
652663
*
@@ -659,7 +670,6 @@ AlterGroupStmt: ALTER GROUP UserId ADD USER user_list
659670
{
660671
AlterGroupStmt *n = makeNode(AlterGroupStmt);
661672
n->name = $3;
662-
n->sysid = -1;
663673
n->action = +1;
664674
n->listUsers = $6;
665675
$$ = (Node *)n;
@@ -668,13 +678,13 @@ AlterGroupStmt: ALTER GROUP UserId ADD USER user_list
668678
{
669679
AlterGroupStmt *n = makeNode(AlterGroupStmt);
670680
n->name = $3;
671-
n->sysid = -1;
672681
n->action = -1;
673682
n->listUsers = $6;
674683
$$ = (Node *)n;
675684
}
676685
;
677686

687+
678688
/*****************************************************************************
679689
*
680690
* Drop a postgresql group

0 commit comments

Comments
 (0)