Annotation of 43BSD/ingres/source/parser/range_fcn.c, revision 1.1

1.1     ! root        1: # include      <ingres.h>
        !             2: # include      <aux.h>
        !             3: # include      <tree.h>
        !             4: # include      <symbol.h>
        !             5: # include      <range.h>
        !             6: # include      "parser.h"
        !             7: # include      <sccs.h>
        !             8: # include      <errors.h>
        !             9: 
        !            10: SCCSID(@(#)range_fcn.c 8.3     2/8/85)
        !            11: 
        !            12: /*
        !            13: **     Range table variables
        !            14: */
        !            15: 
        !            16: PARRNG                 Parrng[MAXRANGE]; /* table for keeping track of atts */
        !            17:                                          /* and allocation of range vars */
        !            18: int                    Resrng;         /* result reln slot */
        !            19: 
        !            20: PARRNG                 *Rngfront;      /* the front of Rnga */
        !            21: PARRNG                 *Rngback;       /* the back of Qt.qt_rangev */
        !            22: 
        !            23: 
        !            24: /*
        !            25: **  RANGE_FCN.C -- functions for manipulating the range table
        !            26: **
        !            27: **     Trace Flags:
        !            28: **             RANGE_FCN.C ~~ 66, 67
        !            29: */
        !            30: 
        !            31: ctlmod_decl(slot)
        !            32: int    slot;
        !            33: {
        !            34:        extern PARRNG   Parrng[];
        !            35: 
        !            36:        Qt.qt_rangev[slot].rngvdesc = NULL;
        !            37:        if (declare(slot, &Parrng[slot].vardesc) != slot)
        !            38:                syserr("declare misdeclared");
        !            39: }
        !            40: 
        !            41: /*
        !            42: **  RNGINIT
        !            43: **     initializes the pointers in the range table
        !            44: **     it should be called prior to starting the parsing
        !            45: **     it also initializes the attrib stash stuff because
        !            46: **     the attrib stash is really part of the range table
        !            47: **
        !            48: **     Trace Flags:
        !            49: **             rnginit ~~ 66.0
        !            50: */
        !            51: rnginit()
        !            52: {
        !            53:        register int            slot;
        !            54:        register PARRNG         *parrngptr;
        !            55:        register RANGEV         *rngptr;
        !            56: 
        !            57: #      ifdef   xPTR2
        !            58:        tTfp(66, 0, "rnginit\n");
        !            59: #      endif
        !            60: 
        !            61:        Rngfront = &Parrng[MAXVAR - 1];                 /* ptr to head of range table */
        !            62:        parrngptr = Parrng;
        !            63:        /* initialize first element */
        !            64:        parrngptr->attlist = NULL;
        !            65:        parrngptr->backpt = NULL;
        !            66:        parrngptr->frontpt = &Parrng[1];
        !            67: 
        !            68:        rngptr = Qt.qt_rangev;
        !            69: 
        !            70:        for (slot = 0, parrngptr = &Parrng[1]; slot < MAXVAR; slot++, parrngptr++)
        !            71:        {
        !            72:                parrngptr->attlist = NULL;
        !            73: 
        !            74:                parrngptr->frontpt = parrngptr + 1;
        !            75:                parrngptr->backpt = parrngptr - 1;
        !            76:        }
        !            77: 
        !            78:        Rngback = Parrng;
        !            79: 
        !            80:        parrngptr = &Parrng[MAXVAR - 1];
        !            81: 
        !            82:        parrngptr->frontpt = NULL;
        !            83: 
        !            84:        /* MAXVAR SLOT = Resultvar */
        !            85:        (++parrngptr)->attlist = NULL;
        !            86:        parrngptr->frontpt = parrngptr->backpt = NULL;
        !            87: 
        !            88:        Rngfront->frontpt = NULL;
        !            89: 
        !            90:        clrrange();
        !            91: 
        !            92:        attinit();
        !            93: }
        !            94: 
        !            95: /*
        !            96: ** RNGLOOK
        !            97: **     returns a pointer to the range table entry else -1
        !            98: **     type = LOOKREL  lookup relation
        !            99: **     type = LOOKVAR  lookup variable
        !           100: **
        !           101: **     Trace Flags:
        !           102: **             rnglook ~~ 66.4, 66.5, 66.6
        !           103: */
        !           104: int
        !           105: rnglook(name, type)
        !           106: char           *name;
        !           107: int            type;
        !           108: {
        !           109:        register PARRNG         *rptr;
        !           110: 
        !           111:        register int            slot;
        !           112: 
        !           113:        DESC                    reldesc;
        !           114: 
        !           115:        int                     i;
        !           116: 
        !           117: #      ifdef   xPTR2
        !           118:        tTfp(66, 4, "rnglook:\ttype = %s\tname = %s\n",
        !           119:                    (type == LOOKVAR ? "variable" : "relation"), name);
        !           120: 
        !           121:        if (tTf(66, 5))
        !           122:                printtable();
        !           123: #      endif
        !           124: 
        !           125:        rptr = Parrng;
        !           126: 
        !           127:        for (slot = 0; slot < MAXVAR; slot++, rptr++)   /* search external vbles only */
        !           128:        {
        !           129:                if (rptr->relvused
        !           130:                    && scompare(name, MAXNAME,
        !           131:                    (type == LOOKVAR ? rptr->vardesc.relvname : rptr->vardesc.reldum.relid),
        !           132:                    MAXNAME) == 0)
        !           133:                {
        !           134:                        Qt.qt_rangev[slot].rngvmark = 1;
        !           135:                        
        !           136: #                      ifdef   xPTR2
        !           137:                        tTfp(66, 6, "fnd '%s' at '%d'\n", name, slot);
        !           138: #                      endif
        !           139: 
        !           140:                        rngfront(slot);
        !           141:                        return (slot);
        !           142:                }
        !           143:        }
        !           144: 
        !           145:        /*
        !           146:        ** We haven't been able to find the variable, assume 
        !           147:        ** it is the name of a relation, and try and insert
        !           148:        ** a new range variable under that name.
        !           149:        */
        !           150:        if (type == LOOKVAR)
        !           151:        {
        !           152:                if ((i = openr(&reldesc, OR_RELTID, name)) < 0)
        !           153:                        syserr("relname: error in openr '%d'", i);
        !           154: 
        !           155:                /*
        !           156:                ** rngent will call rnglook to create var if name
        !           157:                ** was a relation name
        !           158:                */
        !           159:                if (i == 0)
        !           160:                        return(rngent(R_IMPLICIT, name, &reldesc));
        !           161:                else
        !           162:                        return(-1);
        !           163:        }
        !           164:        return (-1);
        !           165: }
        !           166: 
        !           167: /*
        !           168: **  RNGENT
        !           169: **
        !           170: **     Insert variable and relation in range table.
        !           171: **
        !           172: **     Trace Flags:
        !           173: **              rngent ~~ 66.8
        !           174: */
        !           175: 
        !           176: int
        !           177: rngent(type, var, desc)
        !           178: int                    type;
        !           179: char                   *var;
        !           180: register DESC          *desc;
        !           181: {
        !           182:        register PARRNG *rptr;
        !           183:        register int    slot;
        !           184: 
        !           185: #      ifdef   xPTR2
        !           186:        tTfp(66, 8, "rngent:\ttype=%s\tvar=%s\n",
        !           187:                (type == R_INTERNAL ? "internal" : "external"), var);
        !           188: #      endif
        !           189: 
        !           190:        if (type == R_INTERNAL)
        !           191:                slot = MAXVAR;          /* the internal variable */
        !           192:        else
        !           193:        {
        !           194:                if ((type == R_IMPLICIT) || (slot = rnglook(var, LOOKVAR)) < 0)
        !           195:                {
        !           196:                        /* not in range table */
        !           197:                        slot = rngold();
        !           198:                }
        !           199: 
        !           200:                rngfront(slot);
        !           201:        }
        !           202: 
        !           203:        rptr = &Parrng[slot];
        !           204: 
        !           205:        if (!bequal(desc, &rptr->vardesc, sizeof (*desc)))
        !           206:        {
        !           207:                attfree(rptr->attlist);
        !           208:                rptr->attlist = NULL;
        !           209:        }
        !           210: 
        !           211:        rptr->relvused = 1;
        !           212: 
        !           213:        bmove(desc, &rptr->vardesc, sizeof(*desc));
        !           214:        pmove(var, rptr->vardesc.relvname, MAXNAME, ' ');
        !           215: 
        !           216:        ctlmod_decl(slot);
        !           217: 
        !           218:        return (slot);
        !           219: }
        !           220: 
        !           221: /*
        !           222: ** RNGDEL
        !           223: **     removes an entry from the range table
        !           224: **     removes all variables for the relation name
        !           225: **
        !           226: **     Trace Flags:
        !           227: **              rngdel ~~ 66.12
        !           228: */
        !           229: rngdel(rel)
        !           230: register char  *rel;
        !           231: {
        !           232:        register int    slot;
        !           233: 
        !           234: # ifdef        xPTR2
        !           235:        tTfp(66, 12, "rngdel: %12s\n", rel);
        !           236: # endif
        !           237: 
        !           238:        while ((slot = rnglook(rel, LOOKREL)) >= 0)
        !           239:        {
        !           240:                Parrng[slot].relvused = 0;
        !           241:                rngback(slot);
        !           242:                attfree(Parrng[slot].attlist);
        !           243:                Parrng[slot].attlist = NULL;
        !           244:        }
        !           245: }
        !           246: 
        !           247: 
        !           248: /*
        !           249: ** RNGFRONT
        !           250: **     move entry 'r' to head of range table list
        !           251: **
        !           252: **     Trace Flags:
        !           253: **              rngfront ~~ 67.0 
        !           254: */
        !           255: rngfront(slot)
        !           256: int    slot;
        !           257: {
        !           258:        register PARRNG         *fptr;
        !           259: 
        !           260: #      ifdef   xPTR2
        !           261:        tTfp(67, 0, "rngfront:\tslot %d\n", slot);
        !           262: #      endif
        !           263: 
        !           264: 
        !           265:        rngget(slot);
        !           266: 
        !           267:        fptr = &Parrng[slot];
        !           268: 
        !           269:        fptr->frontpt = NULL;
        !           270:        fptr->backpt = Rngfront;
        !           271:        Rngfront->frontpt = fptr;
        !           272: 
        !           273:        Rngfront = fptr;
        !           274: }
        !           275: 
        !           276: /*
        !           277: ** RNGBACK
        !           278: **     move entry 'r' to back of range table list
        !           279: **
        !           280: **     Trace Flags:
        !           281: **             rngback ~~ 67.4
        !           282: */
        !           283: rngback(slot)
        !           284: int    slot;
        !           285: {
        !           286:        register PARRNG *bptr;
        !           287: 
        !           288: #      ifdef   xPTR2
        !           289:        tTfp(67, 4, "rngback:\tslot %d\n", slot);
        !           290: #      endif
        !           291: 
        !           292:        rngget(slot);
        !           293: 
        !           294:        bptr = &Parrng[slot];
        !           295: 
        !           296:        bptr->backpt = NULL;
        !           297:        bptr->frontpt = Rngback;
        !           298:        Rngback->backpt = bptr;
        !           299: 
        !           300:        Rngback = bptr;
        !           301: }
        !           302: 
        !           303: /*
        !           304: **  RNGGET -- get a descriptor from range table
        !           305: **
        !           306: **     Trace Flags:
        !           307: **             rngget ~~ 67.8
        !           308: */
        !           309: 
        !           310: rngget(slot)
        !           311: int    slot;
        !           312: {
        !           313:        register PARRNG *slotptr;
        !           314:        register PARRNG *forward;
        !           315:        register PARRNG *backward;
        !           316: 
        !           317: #      ifdef   xPTR2
        !           318:        tTfp(67, 8, "rngget:\tslot %d\n", slot);
        !           319: #      endif
        !           320: 
        !           321: 
        !           322:        slotptr = &Parrng[slot];
        !           323:        forward = slotptr->frontpt;
        !           324:        backward = slotptr->backpt;
        !           325: 
        !           326:        if (slotptr == Rngfront)
        !           327:        {
        !           328:                Rngfront = backward;
        !           329:                backward->frontpt = NULL;
        !           330:        }
        !           331:        else if (slotptr == Rngback)
        !           332:        {
        !           333:                Rngback = forward;
        !           334:                forward->backpt = NULL;
        !           335:        }
        !           336:        else
        !           337:        {
        !           338:                forward->backpt = backward;
        !           339:                backward->frontpt = forward;
        !           340:        }
        !           341: 
        !           342:        slotptr->backpt = slotptr->frontpt = NULL;
        !           343: }
        !           344: 
        !           345: /*
        !           346: **  RNGOLD -- find least recently used vble entry
        !           347: **
        !           348: **     Trace Flags:
        !           349: **             rngold ~~ 67.9
        !           350: */
        !           351: int
        !           352: rngold()
        !           353: {
        !           354: # ifdef        xPTR2
        !           355:        tTfp(67, 9, "rngold %d.\n", Rngback - (PARRNG *) Parrng);
        !           356: # endif
        !           357: 
        !           358:        return(Rngback - (PARRNG *) Parrng);
        !           359: }
        !           360: 
        !           361: /*
        !           362: ** RNGRESET
        !           363: **     reset the used marks to '0'
        !           364: **
        !           365: **     Trace Flags:
        !           366: **             rngreset ~~ 67.10
        !           367: */
        !           368: rngreset()
        !           369: {
        !           370:        register int            i;
        !           371:        register RANGEV         *rangevptr;
        !           372: 
        !           373: # ifdef        xPTR2
        !           374:        tTfp(67, 10, "rngreset().\n");
        !           375: # endif
        !           376: 
        !           377:        rangevptr = Qt.qt_rangev;
        !           378: 
        !           379:        for (i = 0; i < MAXVAR; i++, rangevptr++) /* only do external ones */
        !           380:                rangevptr->rngvmark = 0;
        !           381: }
        !           382: 
        !           383: /*
        !           384: ** CHECKUPD
        !           385: **     checks to make sure that the user can update the relation 'name1'
        !           386: **     the 'open' parameter is set if 'Reldesc' contains the openr info
        !           387: **     for the relation in question.
        !           388: **
        !           389: **     Trace Flags:
        !           390: **             checkupd ~~ 67.11
        !           391: */
        !           392: checkupd(entnum)
        !           393: int    entnum;
        !           394: {
        !           395:        extern int              Noupdt;
        !           396:        extern PARRNG           Parrng[];
        !           397:        register PARRNG         *rptr;
        !           398: 
        !           399: # ifdef        xPTR2
        !           400:        tTfp(67, 11, "checkupd(%d).\n", entnum);
        !           401: # endif
        !           402: 
        !           403:        rptr = &Parrng[entnum];
        !           404: 
        !           405:        if (!Noupdt)
        !           406:                return;
        !           407:        if (rptr->vardesc.reldum.relstat & S_NOUPDT)
        !           408:                /* no updates allowed on this relation */
        !           409:                par_error(CANTUPDATE, WARN, trim_relname(rptr->vardesc.reldum.relid), 0);
        !           410: }
        !           411: 
        !           412: /*
        !           413: ** RNGFRESH -- check the range table relstat information for accuracy
        !           414: **
        !           415: **     If the command specified could have changed the relstat info
        !           416: **     make the appropriate adjustments to the range table
        !           417: */
        !           418: rngfresh(op)
        !           419: int    op;
        !           420: {
        !           421:        register PARRNG         *rptr;
        !           422:        register int            slot;
        !           423:        DESC                    desc;
        !           424:        char                    var[MAXNAME];
        !           425: 
        !           426: # ifdef        xPTR2
        !           427:        tTfp(67, 11, "rngfresh %d.\n", op);
        !           428: # endif
        !           429: 
        !           430:        /* search the entire table! */
        !           431:        for (slot = 0, rptr = Parrng; slot <= MAXVAR; slot++, rptr++)
        !           432:        {
        !           433:                if (!(rptr->relvused))
        !           434:                        continue;
        !           435: 
        !           436:                switch (op)
        !           437:                {
        !           438:                  case mdDESTROY:
        !           439:                        if ((rptr->vardesc.reldum.relstat & (S_VBASE | S_INTEG | S_PROTUPS | S_INDEX)) != 0)
        !           440:                        {
        !           441:                        fixordel:
        !           442:                                /*
        !           443:                                ** openr the relation, if it doesn't exist make
        !           444:                                ** sure that all range table entries are gone
        !           445:                                */
        !           446:                                if (!openr(&desc, OR_RELTID, rptr->vardesc.reldum.relid))
        !           447:                                        rptr->vardesc.reldum.relstat = desc.reldum.relstat;
        !           448:                                else
        !           449:                                        /* relation not there, purge table */
        !           450:                                        rngdel(rptr->vardesc.reldum.relid);
        !           451:                        }
        !           452:                        break;
        !           453: 
        !           454:                  case mdVIEW:
        !           455:                        if ((rptr->vardesc.reldum.relstat & S_VBASE) == 0)
        !           456:                        {
        !           457:                        fixorerr:
        !           458:                                /*
        !           459:                                ** if the relation doesn't exist then it is
        !           460:                                ** a syserr, otherwise, copy the bits.
        !           461:                                */
        !           462:                                if (!openr(&desc, OR_RELTID, rptr->vardesc.reldum.relid))
        !           463:                                        rptr->vardesc.reldum.relstat = desc.reldum.relstat;
        !           464:                                else
        !           465:                                {
        !           466:                                        /* not there, syserr */
        !           467:                                        syserr("RNGFRESH: extra entry: %s", rptr->vardesc.reldum.relid);
        !           468:                                }
        !           469:                        }
        !           470:                        break;
        !           471: 
        !           472:                  case mdPROT:
        !           473:                        if ((rptr->vardesc.reldum.relstat & S_PROTUPS) == 0)
        !           474:                                goto    fixorerr;
        !           475:                        break;
        !           476: 
        !           477:                  case mdINTEG:
        !           478:                        if ((rptr->vardesc.reldum.relstat & S_INTEG) == 0)
        !           479:                                goto    fixorerr;
        !           480:                        break;
        !           481: 
        !           482:                  case mdMODIFY:
        !           483:                        if (!openr(&desc, OR_RELTID, rptr->vardesc.reldum.relid))
        !           484:                                if (!bequal(&rptr->vardesc, &desc, sizeof desc))
        !           485:                                /* relation structure may have changed, adjust range variable */
        !           486:                                {
        !           487:                                        bmove(rptr->vardesc.relvname, var, MAXNAME);
        !           488:                                        rngent(R_EXTERNAL, var, &desc);
        !           489:                                }
        !           490:                        if ((rptr->vardesc.reldum.relstat & S_INDEX) != 0)
        !           491:                                goto    fixordel;
        !           492:                        break;
        !           493:                
        !           494:                  default:
        !           495:                        return; /* command ok, dont waste time on rest of table */
        !           496:                }
        !           497:        }
        !           498: }
        !           499: 
        !           500: printtable()
        !           501: {
        !           502:        register PARRNG         *rptr;
        !           503:        int                     slot[MAXRANGE];
        !           504:        int                     i;
        !           505: 
        !           506:        printf("Range table:\n");
        !           507: 
        !           508:        for (i = 0; i < MAXRANGE; i++)
        !           509:                slot[i] = 0;
        !           510: 
        !           511:        for (rptr = Rngfront; rptr != NULL; rptr = rptr->backpt)
        !           512:        {
        !           513:                i = rptr - (PARRNG *) Parrng;
        !           514:                slot[i] = 1;
        !           515:                printslot(i);
        !           516:        }
        !           517:        printf("\nEntries not in list:\n");
        !           518:        for (i = 0; i < MAXRANGE; i++)
        !           519:        {
        !           520:                if (!slot[i])
        !           521:                {
        !           522:                        printslot(i);
        !           523:                }
        !           524:        }
        !           525: }
        !           526: 
        !           527: printslot(slot)
        !           528: int    slot;
        !           529: {
        !           530:        register RANGEV         *rptr;
        !           531:        register PARRNG         *auxptr;
        !           532: 
        !           533:        rptr = &Qt.qt_rangev[slot];
        !           534:        auxptr = &Parrng[slot];
        !           535: 
        !           536:        printf("slot:\t%d\n{\trvar:\t%.12s,\trelnm:\t%.12s.\n",
        !           537:            slot, auxptr->vardesc.relvname,
        !           538:            auxptr->vardesc.reldum.relid);
        !           539:        printf("\tRELVUSED: %d, RELVSEND %d.\n",
        !           540:            auxptr->relvused,
        !           541:            rptr->rngvmark);
        !           542: 
        !           543: 
        !           544:        printf("\tratts: %d, attlist: %d.\n}\n", auxptr->vardesc.reldum.relatts, auxptr->attlist);
        !           545: }

unix.superglobalmegacorp.com

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