|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.