|
|
1.1 root 1: /*
2: ** GRAMMAR.Y
3: **
4: ** This file contains a grammar for ingres parsing. It is setup
5: ** for the (7-31-78) version of yacc.
6: **
7: ** Use:
8: ** to use for non-distributed ingres:
9: ** grep -v "DDD" > grammar.y
10: **
11: ** Trace Flags:
12: ** Grammar.y ~~ 38, 39
13: */
14:
15: %{
16: /* SCANNER/PARSER GLOBALS & TABLES */
17: # include <ingres.h>
18: # include <aux.h>
19: # include <tree.h>
20: # include <symbol.h>
21: # include <pv.h>
22: # include "parser.h"
23: # include <sccs.h>
24:
25: SCCSID(@(#)grammar.y 7.2 4/7/82)
26:
27: # ifdef xPTR1
28: # define YYDEBUG
29: # endif
30:
31: int i;
32: struct atstash *aptr;
33: char permbuf[3];
34: /* space for two names, their null bytes and the seperator */
35: char modbuf[(2 * (MAXNAME + 1)) + 1];
36: static char hqmbuf[2];
37:
38: extern DESC Reldesc;
39: extern int Opflag;
40: extern QTREE *Lastree;
41: extern QTREE *Tidnode;
42: extern int Rsdmno;
43: extern int Resrng;
44: extern int Qrymod;
45: extern int Permcomd;
46: extern char *Trname;
47: extern int Qlflag;
48: extern struct atstash Faketid;
49:
50: # ifdef DISTRIB
51: extern struct atstash Fakesid;
52: # endif
53:
54: extern int Patflag;
55: extern char *Indexname;
56:
57: extern QTREE *tree();
58: extern QTREE *tlprepend();
59: extern QTREE *addresdom();
60: extern QTREE *xdot();
61: extern QTREE *norml();
62: extern struct atstash *attlookup();
63: extern int rngent();
64: extern int rnglook();
65: extern PARRNG Parrng[];
66: %}
67:
68: /* NEW BEGIN-END THINGS */
69: %start program
70:
71: /* UNION YYSTYPE DEFINED */
72: %union
73: {
74: int type_type; /* OPERATOR TYPES ETC. */
75: QTREE *tree_type;
76: int rng_type;
77: char char_type;
78: int int_type;
79: short *I2_type;
80: long *I4_type;
81: float *F4_type;
82: double *F8_type;
83: char *string_type;
84: }
85:
86: /* COMMANDS */
87: %token APPEND COPY CREATE DELETE DESTROY HELP INDEX MODIFY
88: %token PRINT RANGE REPLACE RETRIEVE SAVE
89: %token DEFINE PERMIT VIEW INTEGRITY
90: /*DDD*/%token DISTRIBUTE
91:
92: /* 'NOISE' WORDS */
93: %token ALL BY FROM IN INTO UNIQUE AT
94: %token IS OF ON ONTO TO UNTIL WHERE
95: /*DDD*/%token DISTRD
96:
97: /* CONSTANTS */
98: %token NAME SCONST I2CONST I4CONST F4CONST F8CONST
99:
100: /* PUNCTUATION */
101: %token COMMA LPAREN PERIOD RPAREN COLON BGNCMNT ENDCMNT
102:
103: /* UNARY ARITHMETIC OPERATORS */
104: %token UAOP
105:
106: /* BINARY ARITHMETIC OPERATORS */
107: %token BAOP BAOPH
108:
109: /* BOUNDS OPERATORS */
110: %token BDOP
111:
112: /* EQUALITY OPERATORS */
113: %token EOP
114:
115: /* LOGICAL OPERATORS */
116: %token LBOP LUOP
117:
118: /* FUNCTIONAL OPERATORS */
119: %token FOP FBOP
120:
121: /* AGGREGATE OPERATORS */
122: %token AGOP
123:
124: /* TYPES FOR INGRES TOKENS */
125: %type <type_type> IS
126: %type <string_type> NAME SCONST
127: %type <I2_type> I2CONST
128: %type <I4_type> I4CONST
129: %type <F4_type> F4CONST
130: %type <F8_type> F8CONST
131: %type <type_type> UAOP
132: %type <type_type> BAOP BAOPH
133: %type <type_type> BDOP
134: %type <type_type> EOP
135: %type <type_type> LBOP LUOP
136: %type <type_type> FOP FBOP
137: %type <type_type> AGOP
138:
139: /* TYPES FOR INGRES NON-TERMINALS */
140: %type <tree_type> permtarg permtlist permtlelm
141: /*DDD*/%type <tree_type> distribute distcrits dcriterion
142: %type <tree_type> tlclause tlist tlelm
143: %type <tree_type> qualclause qual clause afcn aggrfcn
144: %type <type_type> relop
145: %type <tree_type> domseq targdom attrib
146: %type <rng_type> var
147: %type <tree_type> attribfcn
148: %type <type_type> uop
149: %type <string_type> alias
150:
151: /* DEFINE ASCENDING PRECEDENCE FOR OPERATORS */
152: %left LBOP
153: %left LUOP
154: %left UAOP
155: %left BAOP
156: %left BAOPH
157: %nonassoc unaryop
158:
159: %%
160: program: program stmnt =
161: {
162: # ifdef xPTR1
163: tTfp(38, 0, "*** [program stmnt] parsed.\n");
164: # endif
165:
166: if (endquelst(Opflag) < 0)
167: return (-1);
168: }
169: | stmnt =
170: {
171: # ifdef xPTR1
172: tTfp(38, 1, "*** [stmnt] parsed.\n");
173: # endif
174:
175: if (endquelst(Opflag) < 0)
176: return (-1);
177: }
178: |
179: {
180: # ifdef xPTR1
181: tTfp(38, 2, "*** [(NULL)] parsed.\n");
182: # endif
183: }
184: ;
185: stmnt: append
186: | copy
187: | create
188: | delete
189: | destroy
190: /*DDD*/ | distribute
191: | help
192: | index
193: | integrity
194: | modify
195: | permit
196: | print
197: | range
198: | replace
199: | retrieve
200: | save
201: | view
202: | error
203: {
204: # ifdef xPTR1
205: tTfp(38, 0, "*** [error] parsed.\n");
206: # endif
207: }
208:
209: ;
210: range: rngstmnt OF NAME IS NAME =
211: {
212: if ((i = openr(&Reldesc, -1, $5)) < 0)
213: syserr("relname: error in openr '%d'", i);
214: if (i > 0)
215: {
216: /* invalid relation name */
217: par_error(RNGEXIST, WARN, $5, 0);
218: YYERROR;
219: }
220: else
221: rngent(R_EXTERNAL, $3, &Reldesc);
222: }
223: ;
224: rngstmnt: RANGE =
225: {
226: Opflag = mdRANGE;
227: }
228: ;
229: append: apstmnt apto relation tlclause qualclause =
230: {
231: /* make root node */
232: Lastree = tree($4, $5, ROOT, sizeof(struct rootnode), 1);
233: }
234: ;
235: apstmnt: APPEND =
236: {
237: Opflag = mdAPP;
238: }
239: ;
240: apto: INTO
241: | ONTO
242: | TO
243: | ON
244: | ;
245: ;
246: delete: delstmnt delwd relation qualclause =
247: {
248: /* make root node for delete, with a TIDNODE at leftmost */
249: Lastree = tree(tree(NULL, Tidnode, RESDOM, sizeof(struct resdomnode), NULL), $4, ROOT, sizeof(struct rootnode), 1);
250: }
251: ;
252: delstmnt: DELETE =
253: {
254: Opflag = mdDEL;
255: }
256: ;
257: delwd: IN
258: | ON
259: | FROM
260: | ;
261: ;
262: replace: repstmnt repkwd relation tlclause qualclause =
263: {
264: /* make root node for replace */
265: Lastree = tree($4, $5, ROOT, sizeof(struct rootnode), 1);
266: }
267: ;
268: repstmnt: REPLACE =
269: {
270: Opflag = mdREPL;
271: }
272: ;
273: repkwd: INTO
274: | IN
275: | ON
276: | ;
277: ;
278: retrieve: retstmnt retclause tlclause qualclause =
279: {
280: /* make root node for retrieve */
281: Lastree = tree($3, $4, ROOT, sizeof(struct rootnode), 1);
282: }
283: ;
284: retstmnt: RETRIEVE =
285: {
286: Opflag = mdRETR;
287: }
288: ;
289: retclause: retkwd relation =
290: {
291: /* set up pipe block and save relname for create */
292: # ifdef xPTR2
293: tTfp(38, 4, "retclause: Rsdmno %d", Rsdmno);
294: # endif
295: Rsdmno = 0;
296: setp(PV_STR, "0"); /* relstat = nil */
297: setp(PV_STR, trim_relname(Parrng[Resrng].vardesc.reldum.relid));
298: }
299: | =
300: {
301: /* no result relation, output to terminal */
302: Rsdmno = 0;
303: Resrng = -1;
304: }
305: | UNIQUE =
306: {
307: Opflag = mdRET_UNI;
308: Rsdmno = 0;
309: Resrng = -1;
310: }
311: ;
312: retkwd: INTO
313: | TO
314: | ;
315: ;
316: view: viewclause tlclause qualclause =
317: {
318: Lastree = tree($2, $3, ROOT, sizeof(struct rootnode), 1);
319: }
320: ;
321: viewclause: viewstmnt relation =
322: {
323: Rsdmno = 0;
324: setp(PV_STR, "0040"); /* relstat = S_VIEW */
325: setp(PV_STR, trim_relname(Parrng[Resrng].vardesc.reldum.relid));
326: }
327: ;
328: viewstmnt: DEFINE VIEW =
329: {
330: Opflag = mdVIEW;
331: if (!Qrymod)
332: {
333: /* no qrymod in database */
334: par_error(NOQRYMOD, WARN, 0);
335: }
336: }
337: ;
338: permit: permstmnt permlist permrel permtarg permwho permplace permtd qualclause =
339: {
340: Lastree = tree($4, $8, ROOT, sizeof(struct rootnode), 1);
341: }
342: ;
343: permstmnt: DEFINE PERMIT =
344: {
345: Opflag = mdPROT;
346: if (!Qrymod)
347: {
348: /* no qrymod in database */
349: par_error(NOQRYMOD, WARN, 0);
350: }
351: }
352: ;
353: permlist: permxlist
354: | permlist COMMA permxlist
355: ;
356: permxlist: ALL =
357: {
358: permcom(-1); /* means 'all' commands */
359: }
360: | RETRIEVE =
361: {
362: permcom(mdRETR);
363: }
364: | DELETE =
365: {
366: permcom(mdDEL);
367: }
368: | APPEND =
369: {
370: permcom(mdAPP);
371: }
372: | REPLACE =
373: {
374: permcom(mdREPL);
375: }
376: ;
377: permrel: permword relation =
378: {
379: /* put command vector into list now since this always happens */
380: setp(PV_INT, Permcomd);
381: Permcomd = 0; /* reset command map */
382: setp(PV_STR, trim_relname(Parrng[Resrng].vardesc.reldum.relid));
383: bmove(Parrng[Resrng].vardesc.reldum.relowner, permbuf, 2);
384: permbuf[2] = 0;
385: setp(PV_STR, permbuf);
386: }
387: ;
388: permword: ON
389: | OF
390: | TO
391: ;
392: permtarg: LPAREN permtlist RPAREN =
393: {
394: $$ = $2;
395: }
396: | =
397: {
398: $$ = NULL;
399: }
400: ;
401: permtlist: permtlelm
402: | permtlist COMMA permtlelm =
403: {
404: /*
405: ** attach bulk of permit tl to leftmost node of new elem
406: */
407: if (!Err_current)
408: $$ = tlprepend($1, $3);
409: }
410: ;
411: permtlelm: NAME =
412: {
413: /* Resrng is set by the "relation" production */
414: if (!Err_current)
415: {
416: Trname = $1;
417: aptr = attlookup(Resrng, Trname);
418: $$ = tree(NULL, NULL, VAR, sizeof(struct varnode), Resrng, aptr);
419: $$ = addresdom(NULL, $$);
420: }
421: }
422: ;
423: permwho: TO NAME =
424: {
425: setp(PV_STR, $2);
426: }
427: | TO ALL =
428: {
429: setp(PV_STR, "all");
430: }
431: ;
432: permplace: AT NAME =
433: {
434: setp(PV_STR, $2);
435: }
436: | AT ALL =
437: {
438: setp(PV_STR, "all");
439: }
440: | =
441: {
442: setp(PV_STR, "all"); /* default is all */
443: }
444: ;
445: permtd: permtime permday
446: | permdeftime permday
447: | permtime permdefday
448: | permdeftime permdefday
449: ;
450: permdeftime: =
451: {
452: setp(PV_INT, 0);
453: setp(PV_INT, 1440);
454: }
455: ;
456: permdefday: =
457: {
458: setp(PV_STR, "sun");
459: setp(PV_STR, "sat");
460: }
461: ;
462: permtime: FROM I2CONST COLON I2CONST TO I2CONST COLON I2CONST =
463: {
464: setp(PV_INT, timeofday($2, $4));
465: setp(PV_INT, timeofday($6, $8));
466: }
467: ;
468: permday: ON NAME TO NAME =
469: {
470: setp(PV_STR, $2);
471: setp(PV_STR, $4);
472: }
473: ;
474: integrity: integstmnt integnoise relation integis qual =
475: {
476: Lastree = tree(NULL, norml($5), ROOT, sizeof(struct rootnode), 1);
477: Qlflag--; /* turn off here */
478: }
479: ;
480: integstmnt: DEFINE INTEGRITY =
481: {
482: Opflag = mdINTEG;
483: Qlflag++; /* OK to turn on here because integrity doesn't have a targ list */
484: if (!Qrymod)
485: {
486: /* no qrymod in database */
487: par_error(NOQRYMOD, WARN, 0);
488: }
489: }
490: ;
491: integnoise: ON
492: | ONTO
493: | IN
494: | OF
495: | /* null */
496: ;
497: integis: IS
498: | /* null*/
499: ;
500: /*DDD*/distribute: diststmnt relation AT distcrits =
501: /*DDD*/ {
502: /*DDD*/ if (!Err_current)
503: /*DDD*/ {
504: /*DDD*/ $$ = tree(NULL, NULL, QLEND, 0);
505: /*DDD*/ Lastree = tree($4, $$, ROOT, sizeof(struct rootnode), 1);
506: /*DDD*/ }
507: /*DDD*/ }
508: /*DDD*/;
509: /*DDD*/diststmnt: DISTRIBUTE =
510: /*DDD*/ Opflag = mdDISTRIB;
511: /*DDD*/;
512: /*DDD*/distcrits: dcriterion =
513: /*DDD*/ {
514: /*DDD*/ $$ = $1;
515: /*DDD*/ }
516: /*DDD*/ | distcrits dcriterion =
517: /*DDD*/ {
518: /*DDD*/ $$ = tlprepend($1, $2);
519: /*DDD*/ }
520: /*DDD*/;
521: /*DDD*/dcriterion: NAME where qual =
522: /*DDD*/ {
523: /*DDD*/ Qlflag--;
524: /*DDD*/ syserr("Warning this node may be the wrong size\n");
525: /*DDD*/ if (!Err_current)
526: /*DDD*/ $$ = tree(NULL, norml($3), SITE, 2, $1);
527: /*DDD*/ }
528: /*DDD*/;
529: relation: NAME =
530: {
531: # ifdef xPTR2
532: tTfp(38, 3, "res rel name/var: '%s'\n", $1);
533: # endif
534: switch (Opflag)
535: {
536: case mdRETR:
537: case mdVIEW:
538: /* result better not be a rel name */
539: if ((i = openr(&Reldesc, -1, $1)) < 0)
540: syserr("relation: err openr '%d'", i);
541: if (i == 0)
542: {
543: /* reln exists */
544: if (bequal(Reldesc.reldum.relowner, Usercode, 2))
545: {
546: /* same owner, can't duplicate name */
547: par_error(RESEXIST, WARN, $1, 0);
548: YYERROR;
549: }
550: else if (!Err_current)
551: {
552: /* owned by dba -- purge range table */
553: rngdel($1);
554: }
555: }
556: if (!Err_current)
557: {
558: bmove(Usercode, Reldesc.reldum.relowner, 2);
559: pmove($1, Reldesc.reldum.relid, MAXNAME, ' ');
560: Resrng = rngent(R_INTERNAL, "", &Reldesc);
561: }
562: break;
563:
564: case mdAPP:
565: /* result is a rel name */
566: if (!Err_current)
567: {
568: Resrng = rnglook($1, LOOKREL);
569: if (Resrng < 0)
570: {
571: if ((i = openr(&Reldesc, -1, $1)) < 0)
572: syserr("relation: err openr '%d'", i);
573: if (i)
574: {
575: /* invalid relation name */
576: par_error(RESAPPEX, WARN, $1, 0);
577: YYERROR;
578: }
579: Resrng = rngent(R_INTERNAL, "", &Reldesc);
580: }
581: else
582: ctlmod_decl(Resrng);
583: checkupd(Resrng);
584: }
585: break;
586:
587: case mdPROT:
588: case mdINTEG:
589: # ifdef DISTRIB
590: case mdDISTRIB:
591: # endif
592: /* the result is a tuple variable */
593: Resrng = rnglook($1, LOOKVAR);
594: if (Resrng < 0)
595: {
596: /* variable not declared */
597: par_error(NOVBLE, WARN, $1, 0);
598: YYERROR;
599: }
600: else
601: ctlmod_decl(Resrng);
602: break;
603:
604: case mdREPL:
605: case mdDEL:
606: /* the result is a tuple variable */
607: Resrng = rnglook($1, LOOKVAR);
608: if (Resrng < 0)
609: /* variable not declared */
610: {
611: par_error(NOVBLE, WARN, $1, 0);
612: YYERROR;
613: }
614: else
615: ctlmod_decl(Resrng);
616:
617: checkupd(Resrng);
618: Tidnode = tree(NULL, NULL, VAR, sizeof(struct varnode), Resrng, &Faketid);
619: break;
620: }
621: }
622: ;
623: tlclause: LPAREN tlist RPAREN =
624: {
625: if (Patflag)
626: {
627: /* no patt match in targ list */
628: par_error(NOPATMAT, WARN, 0);
629: }
630: $$ = $2;
631:
632: /*
633: ** replace must have tid node as left branch
634: ** (so does delete but it doesn't have a targ list)
635: */
636: if (Opflag == mdREPL && !Err_current)
637: {
638: $$ = tlprepend(tree(NULL, Tidnode, RESDOM, sizeof(struct resdomnode), 0), $$);
639: }
640: }
641: ;
642: tlist: tlelm
643: | tlist COMMA tlelm =
644: {
645: /*
646: ** attach bulk of targ list to leftmost node
647: ** of new element
648: */
649: if (!Err_current)
650: $$ = tlprepend($1, $3);
651: }
652: ;
653: tlelm: NAME is afcn =
654: {
655: Trname = $1;
656: /* make a new resdom entry for targ list */
657: if (!Err_current)
658: $$ = addresdom(NULL, $3);
659: }
660: | attrib =
661: {
662: /* makes a new resdom entry for targ list */
663: if (!Err_current)
664: $$ = addresdom(NULL, $1);
665: }
666: | var PERIOD ALL =
667: {
668: if (Opflag == mdREPL)
669: {
670: /* ALL not defined for REPLACE */
671: par_error(REPALL, WARN,
672: trim_relname(Qt.qt_rangev[$1].rngvdesc->relvname), 0);
673: YYERROR;
674: }
675: /* makes set of new resdom entries for targ list */
676: else if (!Err_current)
677: $$ = xdot($1);
678: }
679: ;
680: is: IS
681: | BY
682: ;
683: qualclause: where qual =
684: {
685: $$ = norml($2);
686: Qlflag--;
687: }
688: | =
689: {
690: /* null qualification */
691: $$ = norml(NULL);
692: }
693: ;
694: where: WHERE =
695: {
696: Qlflag++;
697: }
698: ;
699: qual: LPAREN qual RPAREN =
700: {
701: $$ = $2;
702: }
703: | LUOP qual =
704: {
705: $$ = tree(NULL, $2, UOP, 2, $1);
706: }
707: | qual LBOP qual =
708: {
709: $$ = tree($1, $3, $2, sizeof (struct rootnode) -2, 0);
710: }
711: | clause
712: ;
713: clause: afcn relop afcn =
714: {
715: $$ = tree($1, $3, BOP, 2, $2);
716: }
717: ;
718: relop: EOP
719: | IS
720: | BDOP
721: ;
722: afcn: aggrfcn
723: | attribfcn
724: | afcn BAOPH afcn =
725: {
726: $$ = tree($1, $3, BOP, 2, $2);
727: }
728: | afcn BAOP afcn =
729: {
730: $$ = tree($1, $3, BOP, 2, $2);
731: }
732: | afcn UAOP afcn =
733: {
734: $$ = tree($1, $3, BOP, 2, $2);
735: }
736: | LPAREN afcn RPAREN =
737: {
738: $$ = $2;
739: }
740: | uop afcn %prec unaryop =
741: {
742: $$ = tree(NULL, $2, UOP, 2, $1);
743: }
744: | FOP LPAREN afcn RPAREN =
745: {
746: $$ = tree($3, NULL, UOP, 2, $1);
747: }
748: | FBOP LPAREN afcn COMMA afcn RPAREN =
749: {
750: $$ = tree($3, $5, BOP, 2, $1);
751: }
752: ;
753: aggrfcn: AGOP LPAREN afcn BY domseq qualclause RPAREN =
754: {
755: # ifdef xPTR2
756: tTfp(39, 0, "agg func\n");
757: # endif
758: windup($5);
759: $$ = tree(tree($5, tree(NULL, $3, AOP, 6, $1), BYHEAD, sizeof(struct resdomnode), 0), $6, AGHEAD, sizeof(struct rootnode), 0);
760: tlprepend(tree(NULL, NULL, TREE, 0), $$);
761: }
762: | AGOP LPAREN afcn qualclause RPAREN =
763: {
764: $$ = tree(tree(NULL, $3, AOP, 6, $1), $4, AGHEAD, sizeof(struct rootnode), 0);
765: }
766: ;
767: domseq: targdom
768: | domseq COMMA targdom =
769: {
770: $$ = tlprepend($1, $3);
771: }
772: ;
773: targdom: afcn =
774: {
775: $$ = tree(NULL, $1, RESDOM, sizeof(struct resdomnode), Rsdmno);
776: }
777: ;
778: attrib: var PERIOD NAME =
779: {
780: # ifdef xPTR2
781: tTfp(39, 1, "attrib %12s.%12s found\n",
782: Qt.qt_rangev[$1].rngvdesc->relvname, $3);
783: # endif
784:
785: /* remember attribute name */
786: Trname = $3;
787:
788: /* look up attribute */
789: aptr = attlookup($1, Trname);
790: $$ = tree(NULL, NULL, VAR, sizeof(struct varnode), $1, aptr);
791: }
792: ;
793: var: NAME =
794: {
795: $$ = rnglook($1, LOOKVAR);
796: if ($$ < 0)
797: {
798: /* variable not declared */
799: par_error(NOVBLE, WARN, $1, 0);
800: YYERROR;
801: }
802: else
803: ctlmod_decl($$);
804: }
805: ;
806: attribfcn: I2CONST =
807: {
808: $$ = tree(NULL, NULL, INT, 2, $1);
809: }
810: | I4CONST =
811: {
812: $$ = tree(NULL, NULL, INT, 4, $1);
813: }
814: | F4CONST =
815: {
816: $$ = tree(NULL, NULL, FLOAT, 4, $1);
817: }
818: | F8CONST =
819: {
820: $$ = tree(NULL, NULL, FLOAT, 8, $1);
821: }
822: | SCONST =
823: {
824: if (patmat($1) && !Qlflag)
825: Patflag = 1;
826: $$ = tree(NULL, NULL, CHAR, length($1), $1);
827: }
828: | NAME =
829: {
830: $$ = tree(NULL, NULL, COP, 2, $1);
831: }
832: | attrib
833: ;
834: uop: UAOP %prec unaryop =
835: {
836: if ($1 == opADD)
837: $$ = opPLUS;
838: else
839: if ($1 == opSUB)
840: $$ = opMINUS;
841: }
842: ;
843: copy: copstmnt alias LPAREN coparam RPAREN keywd SCONST =
844: {
845: # ifdef xPTR2
846: tTfp(39, 3, "copy %12s,%12s\n", $2, $7);
847: # endif
848:
849: setp(PV_STR, $7);
850: }
851: ;
852: copstmnt: COPY =
853: {
854: Opflag = mdCOPY;
855: }
856: ;
857: coparam: cospecs
858: | ;
859: ;
860: cospecs: alias is coent
861: | cospecs COMMA alias is coent
862: ;
863: coent: alias
864: | SCONST =
865: {
866: setp(PV_STR, $1);
867: }
868: ;
869: alias: NAME =
870: {
871: if (!Err_current)
872: {
873: setp(PV_STR, $1);
874: if (Opflag == mdDESTROY || Opflag == mdCREATE
875: # ifdef DISTRIB
876: || Opflag == mdDCREATE
877: # endif
878: )
879: rngdel($1);
880: }
881: }
882: ;
883: specs: alias is alias
884: | specs COMMA alias is alias
885: ;
886: keywd: INTO =
887: {
888: setp(PV_STR, "\0");
889: setp(PV_STR, "i");
890: }
891: | FROM =
892: {
893: setp(PV_STR, "\0");
894: setp(PV_STR, "f");
895: }
896: ;
897: create: crestmnt alias LPAREN specs RPAREN
898: ;
899: crestmnt: CREATE =
900: {
901: Opflag = mdCREATE;
902:
903: /* set up parameters for regular create */
904: setp(PV_STR, "0"); /* relstat = nil */
905: }
906: /*DDD*/ | CREATE DISTRD =
907: /*DDD*/ {
908: /*DDD*/ Opflag = mdDCREATE;
909: /*DDD*/
910: /*DDD*/ /* setup parameters for distributed create */
911: /*DDD*/ setp(PV_STR, "U");
912: /*DDD*/ setp(PV_STR, "");
913: /*DDD*/ setp(PV_STR, "01000"); /* relstat = S_DISTRIBUTED */
914: /*DDD*/ }
915: ;
916: destroy: destmnt keys
917: | destqm destlist
918: ;
919: destmnt: DESTROY =
920: {
921: Opflag = mdDESTROY;
922: }
923: ;
924: destqm: destmnt INTEGRITY NAME =
925: {
926: Opflag = mdREMQM;
927: if (!Qrymod)
928: /* no qrymod in database */
929: par_error(NOQRYMOD, WARN, 0);
930: setp(PV_STR, "6");
931: setp(PV_STR, $3);
932: }
933: | destmnt PERMIT NAME =
934: {
935: Opflag = mdREMQM;
936: if (!Qrymod)
937: /* no qrymod in database */
938: par_error(NOQRYMOD, WARN, 0);
939: setp(PV_STR, "5");
940: setp(PV_STR, $3);
941: }
942: ;
943: destlist: I2CONST =
944: {
945: i = iocv(*($1));
946: setp(PV_STR, i);
947: }
948: | destlist COMMA I2CONST =
949: {
950: i = iocv(*($3));
951: setp(PV_STR, i);
952: }
953: | ALL
954: ;
955: help: helstmnt hlist
956: | helstmnt =
957: {
958: setp(PV_STR, "2"); /* all relns */
959: }
960: | helqmstmnt hqmlist
961: ;
962: helstmnt: HELP =
963: {
964: Opflag = mdHELP;
965: }
966: ;
967: helqmstmnt: HELP VIEW =
968: {
969: Opflag = mdDISPLAY;
970: if (!Qrymod)
971: /* no qrymod in database */
972: par_error(NOQRYMOD, WARN, 0);
973: smove("4", hqmbuf);
974: }
975: | HELP PERMIT =
976: {
977: Opflag = mdDISPLAY;
978: if (!Qrymod)
979: /* no qrymod in database */
980: par_error(NOQRYMOD, WARN, 0);
981: smove("5", hqmbuf);
982: }
983: | HELP INTEGRITY =
984: {
985: Opflag = mdDISPLAY;
986: if (!Qrymod)
987: /* no qrymod in database */
988: par_error(NOQRYMOD, WARN, 0);
989: smove("6", hqmbuf);
990: }
991: ;
992: hlist: hparam
993: | hlist COMMA hparam
994: | ALL =
995: {
996: setp(PV_STR, "3");
997: }
998: ;
999: hparam: NAME =
1000: {
1001: /* relation */
1002: setp(PV_STR, "0");
1003: setp(PV_STR, $1);
1004: }
1005: | SCONST =
1006: {
1007: /* manual page */
1008: setp(PV_STR, "1");
1009: setp(PV_STR, $1);
1010: }
1011: ;
1012: hqmlist: NAME =
1013: {
1014: setp(PV_STR, hqmbuf);
1015: setp(PV_STR, $1);
1016: }
1017: | hqmlist COMMA NAME =
1018: {
1019: setp(PV_STR, hqmbuf);
1020: setp(PV_STR, $3);
1021: }
1022: ;
1023: index: instmnt LPAREN keys RPAREN =
1024: {
1025: if (Rsdmno > MAXKEYS)
1026: /* too many attributes in key */
1027: par_error(INDEXTRA, WARN, 0);
1028: }
1029: ;
1030: instmnt: indexq ON NAME IS NAME =
1031: {
1032: /* init INDEX command */
1033: Rsdmno = 0;
1034: setp(PV_STR, $3);
1035: setp(PV_STR, $5);
1036: Indexname = $5;
1037: }
1038: ;
1039: indexq: INDEX =
1040: {
1041: Opflag = mdINDEX;
1042: }
1043: ;
1044: modify: modstmnt alias TO modstorage modkeys modqual
1045: ;
1046: modstmnt: MODIFY =
1047: {
1048: Opflag = mdMODIFY;
1049: Rsdmno = 0;
1050: }
1051: ;
1052: modstorage: NAME =
1053: {
1054: setp(PV_STR, $1);
1055: }
1056: modkeys: modstkey modrptkey
1057: | ;
1058: ;
1059: modstkey: ON =
1060: {
1061: setp(PV_STR, "name");
1062: }
1063: ;
1064: modrptkey: modbasekey
1065: | modrptkey COMMA modbasekey
1066: ;
1067: modbasekey: NAME =
1068: {
1069: setp(PV_STR, $1);
1070: }
1071: | NAME COLON NAME =
1072: {
1073: concat($1, ztack(":", $3), modbuf);
1074: setp(PV_STR, modbuf);
1075: }
1076: ;
1077: modqual: modcond modfill
1078: | ;
1079: ;
1080: modcond: WHERE =
1081: {
1082: setp(PV_STR, "\0");
1083: }
1084: ;
1085: modfill: modfillnum
1086: | modfill COMMA modfillnum
1087: ;
1088: modfillnum: NAME IS I2CONST =
1089: {
1090: setp(PV_STR, $1);
1091: i = iocv(*($3));
1092: setp(PV_STR, i);
1093: }
1094: ;
1095: keys: alias =
1096: {
1097: Rsdmno++;
1098: }
1099: | keys COMMA alias =
1100: {
1101: Rsdmno++;
1102: }
1103: ;
1104: print: prinstmnt keys
1105: ;
1106: prinstmnt: PRINT =
1107: {
1108: Opflag = mdPRINT;
1109: }
1110: ;
1111: save: savstmnt alias UNTIL date
1112: ;
1113: savstmnt: SAVE =
1114: {
1115: Opflag = mdSAVE;
1116: }
1117: ;
1118: date: month day_year day_year
1119: ;
1120: month: alias
1121: | day_year
1122: ;
1123: day_year: I2CONST =
1124: {
1125: i = iocv(*($1));
1126:
1127: # ifdef xPTR3
1128: tTfp(39, 4, "day_year: %s\n", i);
1129: # endif
1130:
1131: setp(PV_STR, i);
1132: }
1133: ;
1134: %%
1135: # include "scanner.h"
1136: # include "tables.y"
1137: # include "yyerror.y"
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.