Annotation of 43BSD/ingres/source/parser/grammar.y, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.