Annotation of 42BSD/ingres/source/parser/tree.c, revision 1.1.1.1

1.1       root        1: # include      <ingres.h>
                      2: # include      <aux.h>
                      3: # include      <tree.h>
                      4: # include      <pv.h>
                      5: # include      "parser.h"
                      6: # include      <symbol.h>
                      7: # include      <sccs.h>
                      8: 
                      9: SCCSID(@(#)tree.c      7.1     2/5/81)
                     10: 
                     11: 
                     12: /*
                     13: ** TREE
                     14: **     FUNCTION TO ADD NODE TO QUERY TREE
                     15: **     RETURN VALUE IS POINTER TO NODE JUST CREATED            
                     16: */
                     17: QTREE *
                     18: tree(lptr, rptr, typ, len, valu, attnum)
                     19: QTREE                  *lptr;
                     20: QTREE                  *rptr;
                     21: char                   typ;
                     22: int                    len;
                     23: register int           valu;
                     24: register struct atstash        *attnum;
                     25: {
                     26:        register QTREE  *tptr;
                     27:        extern char     Trfrmt;
                     28:        extern char     Trfrml;
                     29:        extern char     *need();
                     30:        extern QTREE    *norm();
                     31:        extern int      Err_current;
                     32: 
                     33: # ifdef        xPTR3
                     34:        tTfp(55, 0, "tree type(%d), len(%d), value(%d).\n", typ, len, valu);
                     35: # endif
                     36: 
                     37:        if (Err_current)
                     38:                return (NULL);
                     39: 
                     40:        /* Following is a hack.  Sorry about that John.  */
                     41:        if (typ == AND)
                     42:                len = sizeof (struct rootnode) - sizeof (short);
                     43:        
                     44:        tptr = (QTREE *) need(Qbuf, QT_HDR_SIZ + len);
                     45:        tptr->left = lptr;
                     46:        tptr->right = rptr;
                     47:        tptr->sym.type = typ;
                     48:        tptr->sym.len = len;
                     49: 
                     50:        switch (typ)
                     51:        {
                     52:          case VAR:
                     53:                tptr->sym.value.sym_var.varno = valu & I1MASK;
                     54:                tptr->sym.value.sym_var.attno = attnum->atbid;
                     55:                tptr->sym.value.sym_var.varfrmt = attnum->atbfrmt;
                     56:                tptr->sym.value.sym_var.varfrml = attnum->atbfrml;
                     57:                tptr->sym.value.sym_var.valptr = NULL;
                     58:                break;
                     59: 
                     60:          case ROOT:
                     61:          case AGHEAD:
                     62:                tptr->sym.value.sym_root.rootuser = valu;
                     63:                break;
                     64: 
                     65:          case TREE:
                     66:          case BYHEAD:
                     67:          case AND:
                     68:          case OR:
                     69:          case QLEND:
                     70:                break;
                     71: 
                     72:          case UOP:
                     73:          case BOP:
                     74:                tptr->sym.value.sym_op.opno = valu;
                     75:                format(tptr);
                     76:                break;
                     77: 
                     78:          case COP:
                     79:                if ((tptr->sym.value.sym_op.opno = getcop(valu)) == BADCOP)
                     80:                {
                     81:                        /* bad const operator */
                     82:                        par_error(BADCONSTOP, WARN, valu, 0);
                     83:                        return(NULL);
                     84:                }
                     85:                break;
                     86: 
                     87:          case AOP:
                     88:                format(tptr->right);
                     89:                tptr->sym.value.sym_op.agfrmt = Trfrmt;
                     90:                tptr->sym.value.sym_op.agfrml = Trfrml;
                     91: 
                     92:          case RESDOM:
                     93:                tptr->sym.value.sym_resdom.resno = valu;
                     94:                format(tptr);
                     95:                tptr->sym.value.sym_resdom.resfrmt = Trfrmt;
                     96:                tptr->sym.value.sym_resdom.resfrml = Trfrml;
                     97:                break;
                     98: 
                     99:          default:
                    100:                /* INT, FLOAT, CHAR */
                    101:                bmove(valu, &tptr->sym.value, len & I1MASK);
                    102:                break;
                    103:        }
                    104:        return (tptr);
                    105: }
                    106: 
                    107: /*
                    108: ** WINDUP
                    109: **     assign resno's to resdoms of an agg fcn
                    110: */
                    111: windup(ptr)
                    112: QTREE  *ptr;
                    113: {
                    114:        register int                    tot;
                    115:        register int                    kk;
                    116:        register QTREE                  *t;
                    117: 
                    118:        /* COUNT THE RESDOM'S OF THIS TARGET LIST */
                    119:        kk = 1;
                    120:        for (t = ptr; t; t = t->left)
                    121:                kk++;
                    122:        tot = 1;
                    123:        for (t=ptr; t;t = t->left)
                    124:                t->sym.value.sym_resdom.resno = kk - tot++;
                    125: }
                    126: 
                    127: /*
                    128: ** ADDRESDOM - makes a new entry for the target list
                    129: **
                    130: **     Trname must contain the name of the resdom to
                    131: **     use for the header, create and Rsdmno for append, replace
                    132: **
                    133: **     the parameters are pointers to the subtrees to be
                    134: **     suspended from the node
                    135: */
                    136: QTREE *
                    137: addresdom(lptr, rptr)
                    138: QTREE  *lptr, *rptr;
                    139: {
                    140:        register QTREE  *rtval;
                    141:        register struct atstash         *aptr;
                    142:        char                            buf[10];        /* buffer type and length in ascii for dbu */
                    143: 
                    144:        extern int                      Opflag;
                    145:        extern int                      Rsdmno;
                    146:        extern int                      Equel;
                    147:        extern int                      Resrng;
                    148:        extern char                     Trfrmt;
                    149:        extern char                     Trfrml;
                    150:        extern char                     *Trname;
                    151:        extern PARRNG                   Parrng[];
                    152: 
                    153:        extern QTREE                    *tree();
                    154:        extern struct atstash           *attlookup();
                    155: 
                    156:        int                             temp;
                    157: 
                    158:        switch (Opflag)
                    159:        {
                    160:          case mdRETR:
                    161:          case mdRET_UNI:
                    162:          case mdVIEW:
                    163:                Rsdmno++;
                    164:                if (Rsdmno >= MAXDOM)
                    165:                        /* too many resdoms */
                    166:                        par_error(RESXTRA, FATAL, 0);
                    167:                rtval = tree(lptr, rptr, RESDOM, sizeof (struct resdomnode), Rsdmno);
                    168:                if (!Equel || Resrng)
                    169:                {
                    170:                        /* buffer info for header or CREATE */
                    171:                        setp(PV_STR, Trname);
                    172: 
                    173:                        buf[0] = Trfrmt & I1MASK;
                    174:                        smove(iocv(Trfrml & I1MASK), &buf[1]);
                    175: 
                    176:                        setp(PV_STR, buf);
                    177:                }
                    178:                break;
                    179: 
                    180:          default:
                    181:                /*
                    182:                ** for append and replace, the result domain
                    183:                ** number is determined by the location of
                    184:                ** the attribute in the result relation
                    185:                */
                    186:                if (sequal(Trname, "tid"))
                    187:                        /* attrib not found */
                    188:                        par_error(NOATTRIN, WARN, Trname,
                    189:                            trim_relname(Parrng[Resrng].vardesc.reldum.relid), 0);
                    190: #              ifdef   DISTRIB
                    191:                if (sequal(Trname, "sid"))
                    192:                        /* attrib not found */
                    193:                        par_error(NOATTRIN, WARN, Trname,
                    194:                            trim_relname(Parrng[Resrng].vardesc.reldum.relid), 0);
                    195: #              endif
                    196:                aptr = attlookup(Resrng, Trname);
                    197:                Rsdmno = aptr->atbid;
                    198:                rtval = tree(lptr, rptr, RESDOM, sizeof (struct resdomnode), Rsdmno);
                    199:                if (Opflag != mdPROT)   /* INTEGRITY not possible here */
                    200:                        attcheck(aptr);
                    201:                break;
                    202:        }
                    203:        return (rtval);
                    204: }
                    205: /*
                    206: ** GETCOP
                    207: **     routine to lookup 'string' in constant operators table
                    208: **     constant table is declared in tables.y
                    209: **     structure is defined in ../parser.h
                    210: */
                    211: getcop(string)
                    212: char   *string;
                    213: {
                    214:        register struct constop *cpt;
                    215:        register char           *sptr;
                    216:        extern struct constop   Coptab[];
                    217: 
                    218:        sptr = string;
                    219:        for (cpt = Coptab; cpt->copname; cpt++)
                    220:                if (sequal(sptr, cpt->copname))
                    221:                        return (cpt->copnum);
                    222:        return (BADCOP);
                    223: }

unix.superglobalmegacorp.com

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