Annotation of 43BSD/ingres/source/parser/att_fcn.c, revision 1.1.1.1

1.1       root        1: # include      <ingres.h>
                      2: # include      <aux.h>
                      3: # include      <tree.h>
                      4: # include      <symbol.h>
                      5: # include      "parser.h"
                      6: # include      <sccs.h>
                      7: # include      <errors.h>
                      8: 
                      9: SCCSID(@(#)att_fcn.c   8.2     2/8/85)
                     10: 
                     11: /*
                     12: ** fake attribute stash entries for tid nodes (and sid in dist version)
                     13: **     these are provided by the system to a program only for debugging
                     14: **     the system source and do not have well defined (over time) meanings.
                     15: */
                     16: struct atstash Faketid =
                     17: {
                     18:        0,      INT,    4,      "tid",  0
                     19: };
                     20: #ifdef DISTRIB
                     21: struct atstash Fakesid
                     22: {
                     23:        0,      INT,    4,      "sid",  0
                     24: };
                     25: #endif
                     26: 
                     27: struct atstash         Attable[MAXATT];/* attrib stash space, turned into a list later */
                     28: struct atstash         *Freeatt;       /* free list of attrib stash */
                     29: 
                     30: /*
                     31: **  ATT_FCN.C  --  attribute list manipulation routines
                     32: **
                     33: **     ATT_FCN ~~ trace flags = 40, 41
                     34: **
                     35: **     Defines:
                     36: **             Attable
                     37: **             Freeatt
                     38: **             attinit()
                     39: **             attlookup()
                     40: **             attadd()
                     41: **             attfnd()
                     42: **             attcheck()
                     43: **             attfree()
                     44: **             attalloc()
                     45: **             attcount()
                     46: **
                     47: **     History:
                     48: **             modified for 6.3 (jiw)
                     49: */
                     50: 
                     51: /*
                     52: **   ATTINIT -- initializes attribute table
                     53: **
                     54: **     Parameters:
                     55: **             none
                     56: **
                     57: **     Trace Flags:
                     58: **             attinit ~~ 40.0
                     59: */
                     60: 
                     61: attinit()
                     62: {
                     63:        register struct atstash         *atptr;
                     64:        register int                    i;
                     65: 
                     66: # ifdef        xPTR3
                     67:        tTfp(40, 0, "attinit");
                     68: # endif
                     69: 
                     70:        atptr = Attable;
                     71: 
                     72:        for (i = 0; i < MAXATT - 1; i++)
                     73:        {
                     74:                atptr->atbnext = atptr + 1;
                     75:                atptr++;
                     76:        }
                     77: 
                     78:        atptr->atbnext = NULL;
                     79: 
                     80:        Freeatt = Attable;              /* the first attribute in chain */
                     81: }
                     82: 
                     83: /*
                     84: **  ATTLOOKUP -- finds attribute entry
                     85: **
                     86: **     Attlookup looks up atribute 'attrib' in the att stash
                     87: **     for range table entry 'slot'.  If the attrib is not
                     88: **     in the stash it is entered.
                     89: **
                     90: **     Parameters:
                     91: **             attrib -- the name of the attribute to find
                     92: **             slot -- the number of the range variable
                     93: **
                     94: **     Returns:
                     95: **             pointer to the attstash element
                     96: **
                     97: **     Trace Flags:
                     98: **             attlookup ~~ 40.4, 40.5
                     99: */
                    100: 
                    101: struct atstash *
                    102: attlookup(slot, attrib)
                    103: int            slot;
                    104: char           *attrib;
                    105: {
                    106:        register PARRNG                 *rptr;
                    107:        register struct atstash         *current;
                    108:        int                             ik;
                    109:        struct attribute                tuple;
                    110:        register struct attribute       *ktuple;
                    111:        struct attribute                ktup;
                    112:        TID                             tid;
                    113: 
                    114:        extern struct atstash           *attfind();
                    115:        extern struct atstash           *attadd();
                    116:        extern DESC                     Attdes;
                    117:        extern PARRNG                   Parrng[];
                    118: 
                    119:        rptr = &Parrng[slot];
                    120: 
                    121:        ktuple = &ktup;
                    122: #      ifdef   xPTR2
                    123:        tTfp(40, 4, "attlookup: att = %s and rel= %s\n", attrib, trim_relname(rptr->vardesc.reldum.relid));
                    124: #      endif
                    125: 
                    126:        /* attribute called "tid" is phantom attribute, use fake */
                    127:        if (sequal("tid", attrib))
                    128:                return (&Faketid);
                    129: #      ifdef   DISTRIB
                    130:        if (sequal("sid", attrib))
                    131:                return (&Fakesid);
                    132: #      endif
                    133: 
                    134:        /* check to see if attrib is in stash */
                    135:        if ((current = attfind(slot, attrib)) != NULL)
                    136:                return (current);
                    137: 
                    138: #      ifdef   xPTR2
                    139:        tTfp(40, 5, "getting att info from relation\n");
                    140: #      endif
                    141: 
                    142:        /* rel name, owner, attname is unique ident */
                    143:        clearkeys(&Attdes);
                    144:        setkey(&Attdes, ktuple, rptr->vardesc.reldum.relid, ATTRELID);
                    145:        setkey(&Attdes, ktuple, rptr->vardesc.reldum.relowner, ATTOWNER);
                    146:        setkey(&Attdes, ktuple, attrib, ATTNAME);
                    147:        if (!(ik = getequal(&Attdes, ktuple, &tuple, &tid)))
                    148:        {
                    149:                /* put attrib stuff into att stash */
                    150:                current = attadd(slot, &tuple);
                    151:                return (current);
                    152:        }
                    153: 
                    154:        if (ik == 1)
                    155:                /* attribute not in relation */
                    156:                par_error(NOATTRIN, WARN, attrib, trim_relname(rptr->vardesc.reldum.relid), 0);
                    157:        else
                    158:                syserr("fatal error in getequal, ret: %d", ik);
                    159: }
                    160: 
                    161: /*
                    162: **  ATTADD -- add an attribute to the list for a particular range variable
                    163: **
                    164: **     Parameters:
                    165: **             slot -- the number of the range variable to use
                    166: **             tuple -- the attribute tuple to add
                    167: **
                    168: **     Returns:
                    169: **             pointer to the attribute added
                    170: **
                    171: **     Trace Flags:
                    172: **             attadd ~~ 40.8
                    173: */
                    174: 
                    175: struct atstash *
                    176: attadd(slot, tuple)
                    177: int                    slot;
                    178: struct attribute       *tuple;
                    179: {
                    180:        register struct atstash *current;
                    181:        register struct atstash *aptr;
                    182:        register struct atstash *bptr;
                    183:        PARRNG                  *rptr;
                    184:        int                     i;
                    185: 
                    186:        extern struct atstash   *attalloc();
                    187:        extern PARRNG           Parrng[];
                    188: 
                    189: # ifdef        xPTR3
                    190:        tTfp(40, 8, "attadd slot %d, %12s\n", slot, tuple->attname);
                    191: # endif
                    192: 
                    193:        rptr = &Parrng[slot];
                    194: 
                    195:        current = attalloc();
                    196:        current->atbid = tuple->attid;
                    197:        current->atbfrmt = tuple->attfrmt;
                    198:        current->atbfrml = tuple->attfrml;
                    199:        bmove(tuple->attname, current->atbname, MAXNAME);
                    200:        for (i = 0; i < MAXNAME; i++)
                    201:                if (current->atbname[i] == ' ')
                    202:                        current->atbname[i] = '\0';
                    203: 
                    204:        aptr = rptr->attlist;
                    205:        bptr = 0;
                    206:        while (aptr != 0)
                    207:        {
                    208:                if (aptr->atbid > current->atbid)
                    209:                        break;
                    210:                bptr = aptr;
                    211:                aptr = aptr->atbnext;
                    212:        }
                    213:        if (bptr == 0)
                    214:                rptr->attlist = current;
                    215:        else
                    216:                bptr->atbnext = current;
                    217: 
                    218:        current->atbnext = aptr;
                    219: 
                    220:        return (current);
                    221: }
                    222: 
                    223: /*
                    224: **  ATTFIND -- finds attribute in stash
                    225: **
                    226: **     Attfind looks in attribute stash to see if attrib info already there
                    227: **     return pointer to attribute in attribute table else NULL.
                    228: **
                    229: **     Parameters:
                    230: **             slot -- the number of the entry in range table
                    231: **             attrib -- the attribute name to find
                    232: **
                    233: **     Returns:
                    234: **             pointer to entry or NULL if not in stash
                    235: **
                    236: **     Trace Flags:
                    237: **             attfind ~~ 40.12
                    238: */
                    239: 
                    240: struct atstash *
                    241: attfind(slot, attrib)
                    242: int            slot;
                    243: register char  *attrib;
                    244: {
                    245:        register struct atstash *aptr;
                    246: 
                    247:        extern PARRNG           Parrng[];
                    248: 
                    249: # ifdef xPTR1
                    250:        tTfp(40, 12, "attadd\n");
                    251: # endif
                    252: 
                    253:        aptr = Parrng[slot].attlist;
                    254: 
                    255:        while (aptr != NULL)
                    256:        {
                    257:                if (!scompare(attrib, MAXNAME, aptr->atbname, MAXNAME))
                    258:                        return (aptr);
                    259: 
                    260:                aptr = aptr->atbnext;
                    261:        }
                    262:        return (NULL);
                    263: }
                    264: 
                    265: /*
                    266: **  ATTCHECK -- checks for conflicts in attributes
                    267: **
                    268: **     Attcheck checks for type conflicts in the current query domain and
                    269: **     attable entry
                    270: **
                    271: **     Parameters:
                    272: **             aptr -- pointer to current atttibute
                    273: **
                    274: **     Returns:
                    275: **             nothing
                    276: **
                    277: **     Requires:
                    278: **             Trfrmt -- for current format
                    279: **
                    280: **     Trace Flags:
                    281: **             attcheck ~~ 41.0
                    282: */
                    283: 
                    284: attcheck(aptr)
                    285: register struct atstash                *aptr;
                    286: {
                    287:        extern char             Trfrmt;
                    288: 
                    289: # ifdef        xPTR1
                    290:        tTfp(41, 0, "attcheck\n");
                    291: # endif
                    292: 
                    293:        if ((Trfrmt == CHAR) != (aptr->atbfrmt == CHAR))
                    294:                /* function type does not match attrib */
                    295:                par_error(RESTYPE, WARN, aptr->atbname, 0);
                    296: }
                    297: 
                    298: /*
                    299: **  ATTFREE -- puts a list of attrib space back on the free list
                    300: **
                    301: **     Parameters:
                    302: **             aptr -- pointer to list of attstash entries
                    303: **
                    304: **     Returns:
                    305: **             nothing
                    306: **
                    307: **     Requires:
                    308: **             Freeatt
                    309: **
                    310: **     Trace Flags:
                    311: **             attfree ~~ 41.4
                    312: */
                    313: 
                    314: attfree(aptr)
                    315: struct atstash *aptr;
                    316: {
                    317:        register struct atstash *att;
                    318: 
                    319: # ifdef        xPTR1
                    320:        tTfp(41, 4, "attfree\n");
                    321: # endif
                    322: 
                    323:        if ((att = aptr) == NULL)
                    324:                return;
                    325: 
                    326:        while (att->atbnext != NULL)
                    327:                att = att->atbnext;
                    328: 
                    329:        att->atbnext = Freeatt;
                    330:        Freeatt = aptr;
                    331: }
                    332: 
                    333: /*
                    334: **  ATTALLOC -- returns a pointer to a atstash type structure
                    335: **
                    336: **     Attalloc checks the freelist (Freeatt) for attstash entries,
                    337: **     if some is there, one is removed.  If the freelist is empty,
                    338: **     attstashes are removed from range table entries until an free
                    339: **     element is found.
                    340: **
                    341: **     Parameters:
                    342: **             none
                    343: **
                    344: **     Returns:
                    345: **             a pointer to an atstash element
                    346: **
                    347: **     Requires:
                    348: **             Rngback
                    349: **             Freeatt
                    350: **             
                    351: **     Trace Flags:
                    352: **             attalloc ~~ 41.8, 41.9
                    353: */
                    354: 
                    355: struct atstash *
                    356: attalloc()
                    357: {
                    358:        register struct atstash *aptr;
                    359:        register PARRNG         *rptr;
                    360: 
                    361:        extern PARRNG           *Rngback;
                    362: 
                    363: # ifdef        xPTR3
                    364:        tTfp(41, 8, "attalloc Freeatt %d\n", Freeatt);
                    365: # endif
                    366: 
                    367:        /* Note: the following loop doesn't happen if Freeatt != NULL */
                    368: 
                    369:        for (rptr = Rngback; Freeatt == NULL; rptr = rptr->frontpt)
                    370:        {
                    371:                /*
                    372:                ** search least recently used vbles for attrib stash space
                    373:                ** until at least one entry is found
                    374:                */
                    375: 
                    376: # ifdef        xPTR3
                    377:        tTfp(41, 9, "attalloc: freeing %12s\n", rptr->vardesc.relvname);
                    378: # endif
                    379: 
                    380:                if (rptr == NULL)
                    381:                        syserr("attalloc: no att space.");
                    382: 
                    383:                Freeatt = rptr->attlist;
                    384:                rptr->attlist = NULL;
                    385:        }
                    386:        aptr = Freeatt;
                    387:        Freeatt = Freeatt->atbnext;
                    388:        aptr->atbnext = NULL;
                    389: 
                    390:        return (aptr);
                    391: }
                    392: 
                    393: /*
                    394: **  ATTCOUNT -- counts atstash elems
                    395: **
                    396: **     Attcount returns a count fof the number of attributes already in the
                    397: **     attrib stash.
                    398: **
                    399: **     Parameter:
                    400: **             slot -- the range table entry to count
                    401: **
                    402: **     Returns:
                    403: **             count of the attributes
                    404: **
                    405: **     Trace Flags:
                    406: **             attcount ~~ 41.12
                    407: */
                    408: 
                    409: int
                    410: attcount(slot)
                    411: int    slot;
                    412: {
                    413:        register int            cntr;
                    414:        register struct atstash *aptr;
                    415: 
                    416:        extern PARRNG           Parrng[];
                    417: 
                    418: # ifdef        xPTR1
                    419:        tTfp(41, 12, "attcount\n");
                    420: # endif
                    421: 
                    422:        cntr = 0;
                    423:        aptr = Parrng[slot].attlist;
                    424:        while (aptr != NULL)
                    425:        {
                    426:                cntr++;
                    427:                aptr = aptr->atbnext;
                    428:        }
                    429:        return (cntr);
                    430: }

unix.superglobalmegacorp.com

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